
5.4 位运算符和位表达式
C++语言提供了字节位运算,可以直接对操作数的二进制位进行操作。位运算符包括:~(按位取反)、<<(左移)、>>(右移)、&(按位与)、|(按位或)、^(按位异或)。其中,~(按位取反)为单目运算符,其余均为双目运算符。
位运算符作用于位,并逐位执行操作。&、|和^的真值见表5-6。
表5-6 真值表

5.4.1 移位运算符

C++中的移位运算符包括左移“<<”和右移“>>”,见表5-7。
表5-7 移位运算符

1. 左移运算符
左移运算符用来把“<<”左边的运算数的各二进制位全部左移若干位,移动的位数由“<<”右边的数指定。左移时,高位移出的部分舍弃,低位补0。
例如:

用二进制表示运算过程如下:

2. 右移运算符
右移运算符用来把“>>”左边的运算数的各二进制位全部右移若干位,移动的位数由“>>”右边的数字指定。右移时,低位移出的二进制数舍弃,左端移入的二进制数分两种情况:对于无符号整数和正整数,高位补0,对于负整数,高位补1,这是因为负数在机器内均用补码表示。
例如:

用二进制表示运算过程如下:

右移时要注意符号位,对于有符号的数,右移时符号位将一同移动。当为正数时(符号位为0),最高位补0;为负数时(符号位为1),最高位是补0还是补1取决于编译系统的规定。有的系统移入0,有的系统移入1,移入0的称为“逻辑右移”,即简单右移。移入1的称为“算术右移”。
【例5-6】编写程序,使用移位运算符对两个无符号的整数进行移位。
(1)在Visual Studio 2017中,新建名称为“5-6.cpp”的Project6文件。
(2)在代码编辑区域输入以下代码。

【程序分析】本程序中,定义了两个无符号的整型变量x和y并赋值为60和13,通过移位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-7所示。

图5-7 移位运算符
5.4.2 位运算符和位表达式

C++所支持的位运算符见表5-8。
表5-8 位运算符

在双目运算符中,位逻辑与的优先级最高,位逻辑或次之,位逻辑异或最低。
1. 按位与运算&
例如A=31、B=22,经过位逻辑与运算后得到的结果是22。


2. 按位或运算|
例如A=31、B=22,经过位逻辑或运算后得到的结果是31。
A =0001 1111 B =0001 0110

3. 按位异或运算^
例如A=31、B=22,经过位逻辑异或运算后得到的结果是9。
A = 0001 1111 B = 0001 0110

4. 按位取反运算~
例如,60取反运算后得到的结果是-61。

按位取反运算符为单目运算符,运算对象就置于运算符的右边,具有右结合性。其功能是把运算对象的内容按位取反,即1变为0,将0变为1。
注意:在一个有符号的数据中,最高位表示符号位,0代表正数,1代表负数。由于编译器是32位的,所以在取反之后最高位是1。
【例5-7】编写程序,使用位运算符对两个无符号的整数进行运算。
(1)在Visual Studio 2017中,新建名称为“5-7.cpp”的Project7文件。
(2)在代码编辑区域输入以下代码。

【程序分析】本程序中,定义了两个无符号的整型变量A和B并赋值为31和22,通过位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-8所示。

图5-8 位运算