位操作符就是把整型看作二进制位的序列,然后对每个位分别进行位操作。不熟悉二进制的读者可以参考本章“知识拓展”里的内容。由于二进制每个位只可能是0或1,因此一些类似逻辑操作的运算可以用在每一位上,也就是位与、位或、位求反和位异或(异或也是一种逻辑运算,只是C++没有一般的逻辑异或操作符)。具体如表3.3.4所示。
表3.3.4 C++位操作符
表3.3.5总结了位与、位或以及位异或在不同二进制数值组合下的运算结果:
表3.3.5 位运算符真值表
除此以外,位求反就只是简单地将0变成1、1变成0。下面我们会介绍2种移位操作。我们先通过一个简单的示例来了解一下表3.3.4中的前4种操作。
动手写3.3.6
动手写3.3.6展示了二进制的11和01,也就是3和1的各种位运算。运行结果如图3.3.6所示:
(www.xing528.com)
图3.3.6 位操作符示例运行结果
程序的注释中标注了数字的二进制形式,分别是01和11。我们可以看到,由于两个数字的高一位并不都是1,因此位与的结果是0,而低一位都是1,所以结果是1,合在一起是01,也就是十进制的1。位或的运算正好相反,高一位的结果为1,低一位一样都是1,所以结果是11,也就是十进制的3。位异或的原理和逻辑异或一样,只是逻辑异或在C++中并没有操作符支持。简单来说,就是只有2个位不一样的情况下结果才为1,在这里由于2个低位都是1,结果就是0。在程序的注释中,我们标注了a就是二进制中的01,而b是二进制中的11,因此最右位就是2个1的位运算,而左一位是0和1的位运算。我们可以参考表3.3.5中的第二行和第三行结果。
本小节的表格中还出现了左移和右移操作符,其实这两个操作符就是把整型的每一位都左移或者右移。例如无符号二进制整数01001001b,左移1位,右边补0,再左移1位,最左边的1才会移除(根据当前变量的位数决定),右移则相反。然而如果是有符号整型(signed int),右移的时候我们并不能确定当前编译器中左边补的是0还是1,这是需要特别注意的。
提示
由于有符号整型的第一位是符号位,而各个平台上的位操作符对符号位的处理可能各不相同,因此最好使用无符号类型进行位运算。此外,我们可以通过对整型类型的选择来控制位的个数,这在一些情境下是非常有用的。
动手写3.3.7
动手写3.3.7展示了左移和右移对无符号整型的操作。运行结果如图3.3.7所示:
图3.3.7 左移和右移示例运行结果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。