4.8 位运算符
4.8 位运算符
位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。位运算符提供检查和设置二进制位的功能。
- 如果运算对象是“小整型”,则它的值会被自动提升成较大的整数类型
- 运算对象可以是带符号的,也可以是无符号的。如果运算对象是带符号的且它的值为负,那么位运算符如何处理运算对象的“符号位”依赖于机器;而且,此时的左移操作可能会改变符号位的值,因此是一种未定义的行为。
移位运算符
左移运算符<<
在右侧插入值为 0 的二进制位;
右移运算符>>
的行为则依赖于其左侧运算对象的类型:如果该运算对象是无符号类型,在左侧插入值为 0 的二进制位;如果该运算对象是带符号类型的,在左侧插入符号位的副本或值为 0 的二进制位,如何选择视具体环境而定。
位求反运算符
将运算对象逐位求反后生成一个新值。
位与、位或、位异或运算符
位与运算符&
:如果两个运算对象的对应位置都是 1 则运算结果中该位为 1,否则为 0;
位或运算符|
:如果两个运算对象的对应位置至少有一个为 1 则运算结果中该位为 1,否则为 0;
位异或运算符^
:如果两个运算对象的对应位置有且只有一个为 1 则运算结果中该位为 1,否则为 0;
使用位运算符
unsigned long quizl = 0;
quizl |= 1UL << 27; // 表示学生 27 通过了测验
quizl &= ~(1UL << 27); // 表示学生 27 没有通过测验
bool status = quizl & (1UL << 27); // 学生 27 是否通过了测验
移位运算符(又叫 IO 运算符)满足左结合律
移位运算符的优先级介于中间:比算术运算符的优先级低,但比关系运算符的、赋值运算符和条件运算符的优先级高。因此在一次使用多个运算符时,有必要在适当的地方加上括号使其满足我们的要求。