【位运算符(优先级由上到下递减)(左结合律):
~expr // 位求反
expr1 << expr2 // 左移,返回左侧值的二进制形式左移右侧个位的拷贝(右移同理)
expr1 & expr2 // 位与,对应位依次进行相与运算,并返回运算结果。与(&&)注意区分
expr1 ^ expr2 // 位异或,对应位依次进行异或运算(异1同0),并返回运算结果
expr1 | expr2 // 位或,对应位依次进行或运算,并返回运算结果,与(||)注意区分
对于左移和右移运算符,右侧的运算对象一定不能为负,而且值必须严格小于结果的位数。】
【位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。
17.2节将要介绍,一种名为bitset 的标准库类型也可以表示任意大小的二进制位集合,所以位运算符同样能用于bitset 类型。】
【位运算符不改变处理对象,只是将处理对象处理后的拷贝作为返回值,类似之前的toupper() 函数。
一般来说,如果运算对象是“小整形”,则它的值会被自动提升成较大的整数类型。
如果运算对象是带符号的且值为负,则位运算符对其的处理依赖与机器(编码方式),所以一般位运算符通常只用于处理无符号类型。】
【当希望使用数据表示对象的两种不同状态时,使用位及位运算符可以有效地节省空间(时间能节省么?)
unsigned long w = 0; // int 只能确保占16位(机器不同),long可确保至少占32位
w |= 1UL << 27; // 将w 的第28 位置1,其他位不变
w &= ~(1UL << 27); // 将w 的第28位置0,其他位不变
bool status = w & (1UL << 27); // 使用status 拷贝w 的第28位的状态
以上的例子说明了如何
运用位或和位与,来实现控制某些无关位状态不变,将相关位置为所需数值的方法。】
【IO 操作中使用的实际上是左移和右移的重载版本,由此我们可得知移位运算符满足左结合律。
移位运算符的优先级不高不低:比算数运算符的优先级低(输出算术式时不需另加括号,十分方便);但比关系运算符、赋值运算符和条件运算符的优先级高。】