![C++ 从入门到项目实践(超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/805/26846805/b_26846805.jpg)
5.4 位运算符和位表达式
C++语言提供了字节位运算,可以直接对操作数的二进制位进行操作。位运算符包括:~(按位取反)、<<(左移)、>>(右移)、&(按位与)、|(按位或)、^(按位异或)。其中,~(按位取反)为单目运算符,其余均为双目运算符。
位运算符作用于位,并逐位执行操作。&、|和^的真值见表5-6。
表5-6 真值表
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T86_72115.jpg?sign=1738887214-fFgsUxrSD2HIOlFjyIpvtxjKGhqgoIX5-0-de055b238112ba3bf7166827af233576)
5.4.1 移位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72114.jpg?sign=1738887214-MrStXL3ofJx8uR0bLjaSU0S5ZlHbSimh-0-13e3c434ee46e89ef96e8e59da425109)
C++中的移位运算符包括左移“<<”和右移“>>”,见表5-7。
表5-7 移位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T86_72116.jpg?sign=1738887214-sThc02814iALpE7caINDUw781ApSXfBb-0-b91f40f2df13e98ae9da930602855ee0)
1. 左移运算符
左移运算符用来把“<<”左边的运算数的各二进制位全部左移若干位,移动的位数由“<<”右边的数指定。左移时,高位移出的部分舍弃,低位补0。
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72117.jpg?sign=1738887214-7PUxvMQUaEt3hRbX1PhdACwJMtUsC5ky-0-43cb8a9b7eedc9743fd76f6d86340d1b)
用二进制表示运算过程如下:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_73240.jpg?sign=1738887214-31sVpcz7c0HTsyD5BebeIexddQ4NGnnv-0-b7f5dd6b0995dfb96f92fb9bc65cd5c3)
2. 右移运算符
右移运算符用来把“>>”左边的运算数的各二进制位全部右移若干位,移动的位数由“>>”右边的数字指定。右移时,低位移出的二进制数舍弃,左端移入的二进制数分两种情况:对于无符号整数和正整数,高位补0,对于负整数,高位补1,这是因为负数在机器内均用补码表示。
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72118.jpg?sign=1738887214-lQ6gULM98xveYSLTRJXmVh9bVYgmQign-0-ded23dbb7707cc7f7b58e4365761c237)
用二进制表示运算过程如下:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_73242.jpg?sign=1738887214-F14Aomzi8ElJjF4URu1QUq3EcK0ifyv7-0-d2e3b4d659eba746c001c65349bf1470)
右移时要注意符号位,对于有符号的数,右移时符号位将一同移动。当为正数时(符号位为0),最高位补0;为负数时(符号位为1),最高位是补0还是补1取决于编译系统的规定。有的系统移入0,有的系统移入1,移入0的称为“逻辑右移”,即简单右移。移入1的称为“算术右移”。
【例5-6】编写程序,使用移位运算符对两个无符号的整数进行移位。
(1)在Visual Studio 2017中,新建名称为“5-6.cpp”的Project6文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_13193.jpg?sign=1738887214-zVETyus169J2IijKvc1wCq9WalMZsB1y-0-0eaeb4ab843883a3a2df84c7da0a6837)
【程序分析】本程序中,定义了两个无符号的整型变量x和y并赋值为60和13,通过移位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-7所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_13189.jpg?sign=1738887214-oSbP9s9ekFsknPeTNQcoj1IZzVds3Y3d-0-6d391a2a9cea58ea77e21d682c2c5c1b)
图5-7 移位运算符
5.4.2 位运算符和位表达式
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_13192.jpg?sign=1738887214-VyTRQ5yM3shmipRFkkswDetsz4a5z7Xk-0-bd24c24f0cb6b42dfbf5357d9cf31dad)
C++所支持的位运算符见表5-8。
表5-8 位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T87_13194.jpg?sign=1738887214-ICYxjU55QwRCkGgIrvb8SYmynRvpEEYa-0-04f171774cdc71fa130b93d853e6e429)
在双目运算符中,位逻辑与的优先级最高,位逻辑或次之,位逻辑异或最低。
1. 按位与运算&
例如A=31、B=22,经过位逻辑与运算后得到的结果是22。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_72126.jpg?sign=1738887214-VqmtN9XbbzozGTKBuLKrk35RRa66buBv-0-0b218ae1e1476040c6b94ebd31211f46)
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_72127.jpg?sign=1738887214-KGHkWjSBv6230biDT9cAfOlhUIRqYaep-0-b1f01e73b35b1e1b54ffd952dca796bd)
2. 按位或运算|
例如A=31、B=22,经过位逻辑或运算后得到的结果是31。
A =0001 1111 B =0001 0110
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P88_72132.jpg?sign=1738887214-R4f0vzhFkRvYCTW2GOsViW2bRGJJsbgf-0-00aabfbe4739b24444bd62583e650d34)
3. 按位异或运算^
例如A=31、B=22,经过位逻辑异或运算后得到的结果是9。
A = 0001 1111 B = 0001 0110
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P88_72135.jpg?sign=1738887214-0fFAVQgMsQirG4LMSWX6tnjAcvF4Gj6U-0-aba109cde1300feef6b51b68f0affbd6)
4. 按位取反运算~
例如,60取反运算后得到的结果是-61。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P88_72137.jpg?sign=1738887214-h8Z7Ni2vmeXkPb9Gif3F66HxnJd0Tjpg-0-eb35bb84e89294cbb767f42e49f71d23)
按位取反运算符为单目运算符,运算对象就置于运算符的右边,具有右结合性。其功能是把运算对象的内容按位取反,即1变为0,将0变为1。
注意:在一个有符号的数据中,最高位表示符号位,0代表正数,1代表负数。由于编译器是32位的,所以在取反之后最高位是1。
【例5-7】编写程序,使用位运算符对两个无符号的整数进行运算。
(1)在Visual Studio 2017中,新建名称为“5-7.cpp”的Project7文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P88_13346.jpg?sign=1738887214-FRhBAnpaOmWV014ttaoK3GK91kYUd3A5-0-d4d47e944485f59c19b1a6b04b67ac88)
【程序分析】本程序中,定义了两个无符号的整型变量A和B并赋值为31和22,通过位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-8所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P89_13350.jpg?sign=1738887214-A4riXjpYamA5fDwL2AIskwJABENnxhwA-0-236ca584d4fb0aab5690fe0562ebb788)
图5-8 位运算