GESP等级认证C++三级16-位运算5-1
位运算即为对整数进行按位运算,也就是将整数转换成二进制形式后进行的运算。主要包括按位与、按位或、按位异或、按位取反、左移和右移六种运算。因为位运算是计算机最底层的操作,它们直接对应于CPU指令集中的指令,因此位运算比算术运算的效率要高。
1 按位与运算
1.1 运算规则
按位与是一个二元操作,它对两个等长的二进制数的每一位进行独立的逻辑“与”操作。其运算规则如图1所示。
图1 按位与的运算规则
从图1中可以看出,只有两个位都为1时,结果才是1;否则结果为0。
1.2 代码实现
按位与的操作符是“&”,代码如图2所示。
图2 按位与的代码
其中,a的值是5,其二进制形式为“0101”;b的值是3,其二进制形式是“0011”,根据图1所示按位与的运算规则,这两个变量按位与的计算原理如图3所示。
图3 按位与的计算原理
因此,图2中变量c的值为1。
1.3 应用
1.3.1 判断奇偶性
对于奇数,其二进制形式的最低位一定是1,而偶数的最低位一定是0。因此,通过按位与运算,判断其最低位是1还是0,就可以判断这个数的奇偶性,代码如图4所示。
图4 通过按位与判断奇偶性的代码
通过图1所示按位与的运算规则可以看出,1与任何数按位与的结果是这个数的本身;而0与任何数按位与的结果都是0。因此,可以将一个数a与1进行按位与操作,就可以得到a的最低位的值。第7行代码通过if语句判断最低为的值,如果是1则说明是奇数,否则为偶数。
1.3.2 检查特定位的值
在“1.3.1 判断奇偶性”中提到,可以通过一个数a与1进行按位与操作,就可以检查a的最低位的值。除了最低位以外,通过按位与操作,还可以检查a特定位的值,代码如图5所示。
图5 通过按位与检查特定位的值
其中,第7行代码通过a与0x100进行按位与,就可以得到a的二进制形式的第3位的值是0还是1。同理,如果检查a的第4位值,则需要a与0x1000进行按位与。
1.3.3 清除特定位的值(将该位设置为0)
通过按位与运算,可以清楚特定位的值,也就是将特定位的值设置为0。代码如图6所示。
图6 通过按位与清除特定位的值
因为在按位与的运算规则中可以看出,1与任何数按位与的结果是这个数的本身;而0与任何数按位与的结果都是0。第7行代码通过变量a与0b1011进行按位与运算,将a二进制形式的第3位设置为0。a的值是5,其二进制形式是“0101”,将其第3位设置为0之后变为“0001”,此时变量b的值是1。如果要清楚第2位的值,则只需要将该数与0b1101进行按位与运算即可。