C++中的位运算与逻辑运算

发布于:2025-03-03 ⋅ 阅读:(16) ⋅ 点赞:(0)

在 C++ 中,位运算和逻辑运算都是常用的运算类型,但它们的操作对象和运算规则有所不同。下面将分别详细介绍这两种运算。
位运算
位运算主要用于对整数类型(如int、char等)的二进制位进行操作。C++ 提供了 6 种位运算符:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。

  1. 按位与(&)
    按位与运算符会对两个操作数的对应二进制位进行逐位比较,只有当两个对应位都为 1 时,结果的该位才为 1,否则为 0。
#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011
    int result = a & b;  // 二进制: 0001,十进制: 1
    std::cout << "按位与结果: " << result << std::endl;
    return 0;
}
  1. 按位或(|)
    按位或运算符会对两个操作数的对应二进制位进行逐位比较,只要两个对应位中有一个为 1,结果的该位就为 1,只有当两个对应位都为 0 时,结果的该位才为 0。
#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011
    int result = a | b;  // 二进制: 0111,十进制: 7
    std::cout << "按位或结果: " << result << std::endl;
    return 0;
}
  1. 按位异或(^)
    按位异或运算符会对两个操作数的对应二进制位进行逐位比较,当两个对应位不同时,结果的该位为 1,相同时为 0。
#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011
    int result = a ^ b;  // 二进制: 0110,十进制: 6
    std::cout << "按位异或结果: " << result << std::endl;
    return 0;
}
  1. 按位取反(~)
    按位取反运算符是单目运算符,它会对操作数的每一个二进制位进行取反操作,即 0 变为 1,1 变为 0。
#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int result = ~a;  // 二进制: 1010(补码表示),十进制: -6
    std::cout << "按位取反结果: " << result << std::endl;
    return 0;
}
  1. 左移(<<)
    左移运算符会将操作数的二进制位向左移动指定的位数,右边空出的位用 0 填充。左移一位相当于将操作数乘以 2。
#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int result = a << 2;  // 二进制: 010100,十进制: 20
    std::cout << "左移结果: " << result << std::endl;
    return 0;
}
  1. 右移(>>)
    右移运算符会将操作数的二进制位向右移动指定的位数,左边空出的位根据操作数的类型和符号进行填充。对于无符号类型,左边空出的位用 0 填充;对于有符号类型,左边空出的位用符号位填充。右移一位相当于将操作数除以 2。
#include <iostream>
int main() {
    int a = 20;  // 二进制: 010100
    int result = a >> 2;  // 二进制: 000101,十进制: 5
    std::cout << "右移结果: " << result << std::endl;
    return 0;
}

逻辑运算
逻辑运算主要用于布尔类型的操作,也可以用于整数类型(非零值表示true,零值表示false)。C++ 提供了 3 种逻辑运算符:逻辑与(&&)、逻辑或(||)和逻辑非(!)。

  1. 逻辑与(&&)
    逻辑与运算符会对两个操作数进行逻辑判断,只有当两个操作数都为true时,结果才为true,否则为false。逻辑与运算符具有短路特性,即如果第一个操作数为false,则不会再计算第二个操作数。
#include <iostream>
int main() {
    bool a = true;
    bool b = false;
    bool result = a && b;  // 结果为false
    std::cout << "逻辑与结果: " << std::boolalpha << result << std::endl;
    return 0;
}

在C++中,位运算和逻辑运算都是常用的运算类型,但它们的操作对象和运算规则有所不同。下面将分别详细介绍这两种运算。

位运算

位运算主要用于对整数类型(如intchar等)的二进制位进行操作。C++提供了6种位运算符:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。

1. 按位与(&

按位与运算符会对两个操作数的对应二进制位进行逐位比较,只有当两个对应位都为1时,结果的该位才为1,否则为0。

#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011
    int result = a & b;  // 二进制: 0001,十进制: 1
    std::cout << "按位与结果: " << result << std::endl;
    return 0;
}
2. 按位或(|

按位或运算符会对两个操作数的对应二进制位进行逐位比较,只要两个对应位中有一个为1,结果的该位就为1,只有当两个对应位都为0时,结果的该位才为0。

#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011
    int result = a | b;  // 二进制: 0111,十进制: 7
    std::cout << "按位或结果: " << result << std::endl;
    return 0;
}
3. 按位异或(^

按位异或运算符会对两个操作数的对应二进制位进行逐位比较,当两个对应位不同时,结果的该位为1,相同时为0。

#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011
    int result = a ^ b;  // 二进制: 0110,十进制: 6
    std::cout << "按位异或结果: " << result << std::endl;
    return 0;
}
4. 按位取反(~

按位取反运算符是单目运算符,它会对操作数的每一个二进制位进行取反操作,即0变为1,1变为0。

#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int result = ~a;  // 二进制: 1010(补码表示),十进制: -6
    std::cout << "按位取反结果: " << result << std::endl;
    return 0;
}
5. 左移(<<

左移运算符会将操作数的二进制位向左移动指定的位数,右边空出的位用0填充。左移一位相当于将操作数乘以2。

#include <iostream>
int main() {
    int a = 5;  // 二进制: 0101
    int result = a << 2;  // 二进制: 010100,十进制: 20
    std::cout << "左移结果: " << result << std::endl;
    return 0;
}
6. 右移(>>

右移运算符会将操作数的二进制位向右移动指定的位数,左边空出的位根据操作数的类型和符号进行填充。对于无符号类型,左边空出的位用0填充;对于有符号类型,左边空出的位用符号位填充。右移一位相当于将操作数除以2。

#include <iostream>
int main() {
    int a = 20;  // 二进制: 010100
    int result = a >> 2;  // 二进制: 000101,十进制: 5
    std::cout << "右移结果: " << result << std::endl;
    return 0;
}

逻辑运算

逻辑运算主要用于布尔类型的操作,也可以用于整数类型(非零值表示true,零值表示false)。C++提供了3种逻辑运算符:逻辑与(&&)、逻辑或(||)和逻辑非(!)。

1. 逻辑与(&&

逻辑与运算符会对两个操作数进行逻辑判断,只有当两个操作数都为true时,结果才为true,否则为false。逻辑与运算符具有短路特性,即如果第一个操作数为false,则不会再计算第二个操作数。

#include <iostream>
int main() {
    bool a = true;
    bool b = false;
    bool result = a && b;  // 结果为false
    std::cout << "逻辑与结果: " << std::boolalpha << result << std::endl;
    return 0;
}
2. 逻辑或(||

逻辑或运算符会对两个操作数进行逻辑判断,只要两个操作数中有一个为true,结果就为true,只有当两个操作数都为false时,结果才为false。逻辑或运算符也具有短路特性,即如果第一个操作数为true,则不会再计算第二个操作数。

#include <iostream>
int main() {
    bool a = true;
    bool b = false;
    bool result = a || b;  // 结果为true
    std::cout << "逻辑或结果: " << std::boolalpha << result << std::endl;
    return 0;
}
3. 逻辑非(!

逻辑非运算符是单目运算符,它会对操作数的逻辑值进行取反操作,即true变为falsefalse变为true

#include <iostream>
int main() {
    bool a = true;
    bool result = !a;  // 结果为false
    std::cout << "逻辑非结果: " << std::boolalpha << result << std::endl;
    return 0;
}

总结

  • 位运算:操作对象是整数类型的二进制位,用于对二进制位进行逐位操作。
  • 逻辑运算:操作对象主要是布尔类型,用于进行逻辑判断,具有短路特性。
#include <iostream>
int main() {
    bool a = true;
    bool b = false;
    bool result = a || b;  // 结果为true
    std::cout << "逻辑或结果: " << std::boolalpha << result << std::endl;
    return 0;
}

3. 逻辑非(!)
逻辑非运算符是单目运算符,它会对操作数的逻辑值进行取反操作,即true变为false,false变为true。

#include <iostream>
int main() {
    bool a = true;
    bool result = !a;  // 结果为false
    std::cout << "逻辑非结果: " << std::boolalpha << result << std::endl;
    return 0;
}

总结
位运算:操作对象是整数类型的二进制位,用于对二进制位进行逐位操作。
逻辑运算:操作对象主要是布尔类型,用于进行逻辑判断,具有短路特性。