C 语言位操作符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。
按位与(&)
只有当两个二进制位都为 1 时,它才会给出 1 的裁决,否则就是 0。例如,对 5(二进制表示为 0000 0101)和 3(二进制表示为 0000 0011)进行按位与操作时,0000 0101 & 0000 0011 = 0000 0001,结果为 1。按位与操作常常用于清零特定位或者提取指定位的数据。
按位或(|)
只要两个二进制位中有一个为 1,它就会给予 1 的馈赠,只有当两个位都为 0 时,才会给出 0。比如,5 | 3,0000 0101 | 0000 0011 = 0000 0111,结果为 7。按位或操作常用于将特定位设置为 1。
按位异或(^)
当两个二进制位不同时,它会创造出 1 的独特效果,而当两个位相同时,结果为 0。以 5 ^ 3 为例,0000 0101 ^ 0000 0011 = 0000 0110,结果是 6。按位异或操作在数据加密、校验和数据交换等场景中应用较多。
按位取反(~)
将二进制位中的 0 变成 1,1 变成 0。对于 5(0000 0101),~5 的结果是 1111 1010,由于计算机中数据以补码形式存储,这里的结果是一个负数,其原码为 1000 0110,对应的十进制值为 -6。
左移(<<)
将二进制位向左移动指定的位数,右边空出的位用 0 填充。例如,5 << 2,0000 0101 << 2 = 0001 0100,结果为 20。左移操作相当于对原数乘以 2 的移动位数次方,是一种高效的乘法运算方式。
右移(>>)
则是将二进制位向右移动指定的位数。对于无符号数,左边空出的位用 0 填充;对于有符号数,若为正数,左边用 0 填充,若为负数,左边用符号位(即 1)填充。例如,5 >> 1,0000 0101 >> 1 = 0000 0010,结果为 2;而 -5 >> 1,1111 1011 >> 1 = 1111 1101,结果为 -3(这里以补码形式表示,原码为 1000 0011)。右移操作相当于对原数除以 2 的移动位数次方,是一种高效的除法运算方式。
|