![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=1739412567-Eu9QEAran1BBBzaXQWRmNhnyTw9LsFUm-0-4af3cdb020ddbc3a753dc45e47bb55fb)
5.4.1 移位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72114.jpg?sign=1739412567-2vwobB1hnBdGZ7rOqMwLhf1Po6uCMLwD-0-23ebd7a4e6020a088c6f1a48d23f1eb1)
C++中的移位运算符包括左移“<<”和右移“>>”,见表5-7。
表5-7 移位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T86_72116.jpg?sign=1739412567-LVNoGvtNecEWJ99AoXj19xyI3mQjNoHY-0-9ee21bbec1c969538efb19649010cbec)
1. 左移运算符
左移运算符用来把“<<”左边的运算数的各二进制位全部左移若干位,移动的位数由“<<”右边的数指定。左移时,高位移出的部分舍弃,低位补0。
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72117.jpg?sign=1739412567-slND64ABFRWp6xaTedKZghEpj7WFzYdG-0-399b8f31ad352c9dfcb39e4045fa1611)
用二进制表示运算过程如下:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_73240.jpg?sign=1739412567-50gzMnVCjD6fRTWABiwCR9rURnGLjWpK-0-109f976390b6025ad204133bda959276)
2. 右移运算符
右移运算符用来把“>>”左边的运算数的各二进制位全部右移若干位,移动的位数由“>>”右边的数字指定。右移时,低位移出的二进制数舍弃,左端移入的二进制数分两种情况:对于无符号整数和正整数,高位补0,对于负整数,高位补1,这是因为负数在机器内均用补码表示。
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72118.jpg?sign=1739412567-ljiFYaG6ZsSKKXAKzG5JY1qxAtR4oy5J-0-17ab89cd105387caa8a7dd3a45373a34)
用二进制表示运算过程如下:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_73242.jpg?sign=1739412567-AK94VxHqEa532qOnWmG9DC1yrNnRp9Kn-0-73d5388a9f2bae697e148573f2be4255)
右移时要注意符号位,对于有符号的数,右移时符号位将一同移动。当为正数时(符号位为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=1739412567-SQ8C4iEYYC2K4fWOD6xSy4p7KliIXaAf-0-1cb3937255f9c3959a8f28690c217715)
【程序分析】本程序中,定义了两个无符号的整型变量x和y并赋值为60和13,通过移位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-7所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_13189.jpg?sign=1739412567-xmjXjOJeqwisxa4norFfjn0TcVURvsz4-0-47e1a11858e6c093a822bc583e3301fa)
图5-7 移位运算符
5.4.2 位运算符和位表达式
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_13192.jpg?sign=1739412567-iPytYA4xTnQLZDs8KRjRRyndYxgqhHR0-0-fdbdcf3c2efe12cfd98c8813ba7060ef)
C++所支持的位运算符见表5-8。
表5-8 位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T87_13194.jpg?sign=1739412567-i4Ba08uqHZie6r7uMDAqGMBi1iBqsFnV-0-5ab79c00b29e1237da309aeb51cb5cad)
在双目运算符中,位逻辑与的优先级最高,位逻辑或次之,位逻辑异或最低。
1. 按位与运算&
例如A=31、B=22,经过位逻辑与运算后得到的结果是22。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_72126.jpg?sign=1739412567-guM8GpPP5hXwUhRvJy80GpZNsKDJFavd-0-ecddeef74d2ac9b774e65a08a7d21b79)
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_72127.jpg?sign=1739412567-t1KlkADHVPQQReB0QbEk6SUZEMMCwxh3-0-d722f1ae1b2bf07a6d067a52b377cf71)
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=1739412567-mwMDlpenRCRl3bj2R4PZ90KHzwnyBAbg-0-5184febf736e1a085deea245bee8cb10)
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=1739412567-BUYe6j0Eovr02MiAVZhlBgS4SY37XPWy-0-d457f9a1fc945b58526825917dc40dcf)
4. 按位取反运算~
例如,60取反运算后得到的结果是-61。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P88_72137.jpg?sign=1739412567-K8HqzfbX3hVNx2aX8LjMD8I9PMPdEhb4-0-d734f50eec14161b43eab844b2288995)
按位取反运算符为单目运算符,运算对象就置于运算符的右边,具有右结合性。其功能是把运算对象的内容按位取反,即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=1739412567-qoaXAD6kffQqp6Ag8eTUGQX0hMFXuIMo-0-dbf30e15e02d09881169e3d4b9a4b9fd)
【程序分析】本程序中,定义了两个无符号的整型变量A和B并赋值为31和22,通过位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-8所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P89_13350.jpg?sign=1739412567-fOERkbO98rhAkvPkPb6VzePJpUOwj445-0-a6c2cf49280eff4f2e7273b60c170872)
图5-8 位运算