在 C++ 中,位运算和逻辑运算都是常用的运算类型,但它们的操作对象和运算规则有所不同。下面将分别详细介绍这两种运算。
位运算
位运算主要用于对整数类型(如int、char等)的二进制位进行操作。C++ 提供了 6 种位运算符:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。
- 按位与(&)
按位与运算符会对两个操作数的对应二进制位进行逐位比较,只有当两个对应位都为 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,只有当两个对应位都为 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,相同时为 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;
}
- 按位取反(~)
按位取反运算符是单目运算符,它会对操作数的每一个二进制位进行取反操作,即 0 变为 1,1 变为 0。
#include <iostream>
int main() {
int a = 5; // 二进制: 0101
int result = ~a; // 二进制: 1010(补码表示),十进制: -6
std::cout << "按位取反结果: " << result << std::endl;
return 0;
}
- 左移(<<)
左移运算符会将操作数的二进制位向左移动指定的位数,右边空出的位用 0 填充。左移一位相当于将操作数乘以 2。
#include <iostream>
int main() {
int a = 5; // 二进制: 0101
int result = a << 2; // 二进制: 010100,十进制: 20
std::cout << "左移结果: " << result << std::endl;
return 0;
}
- 右移(>>)
右移运算符会将操作数的二进制位向右移动指定的位数,左边空出的位根据操作数的类型和符号进行填充。对于无符号类型,左边空出的位用 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 种逻辑运算符:逻辑与(&&)、逻辑或(||)和逻辑非(!)。
- 逻辑与(&&)
逻辑与运算符会对两个操作数进行逻辑判断,只有当两个操作数都为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++中,位运算和逻辑运算都是常用的运算类型,但它们的操作对象和运算规则有所不同。下面将分别详细介绍这两种运算。
位运算
位运算主要用于对整数类型(如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;
}
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
变为false
,false
变为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;
}
总结
位运算:操作对象是整数类型的二进制位,用于对二进制位进行逐位操作。
逻辑运算:操作对象主要是布尔类型,用于进行逻辑判断,具有短路特性。