![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=1739410650-YT0pJz4vZasyasKa9fi7nlFK7RkOJM72-0-1464fb7cdc83505c42c610626b1bb891)
5.4.1 移位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72114.jpg?sign=1739410650-XBbfEobBQiTP6Ww7vm1XHkVdnLGGiC8E-0-f56ce17ccb49e81a6f3fdcbf15fbbda7)
C++中的移位运算符包括左移“<<”和右移“>>”,见表5-7。
表5-7 移位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T86_72116.jpg?sign=1739410650-ox2OMYTyrMSz6G9TQRtpaDTSvhtN4eGm-0-06a193c981dc9fc25d4868b069df0967)
1. 左移运算符
左移运算符用来把“<<”左边的运算数的各二进制位全部左移若干位,移动的位数由“<<”右边的数指定。左移时,高位移出的部分舍弃,低位补0。
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72117.jpg?sign=1739410650-gp1XLnHo7v4xobtOKf2iMwyU1thrdpbw-0-6b7f58b1631173defa55280105ef4640)
用二进制表示运算过程如下:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_73240.jpg?sign=1739410650-RdhPhB3MlTY8Hi3LYM2FHr9ysQXdU0py-0-02c10b8ad57e988a74285a3e8b83a289)
2. 右移运算符
右移运算符用来把“>>”左边的运算数的各二进制位全部右移若干位,移动的位数由“>>”右边的数字指定。右移时,低位移出的二进制数舍弃,左端移入的二进制数分两种情况:对于无符号整数和正整数,高位补0,对于负整数,高位补1,这是因为负数在机器内均用补码表示。
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72118.jpg?sign=1739410650-ygSs3F5yKn73amfMr6EqcHL0oEbXw4lW-0-c156fef15db7b716b9c680e5d5a04d2a)
用二进制表示运算过程如下:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_73242.jpg?sign=1739410650-6fwNM7EmJuSMlexk7M5edvjrpah7TN2a-0-ffed256f61e253f63a4086f54b9c1540)
右移时要注意符号位,对于有符号的数,右移时符号位将一同移动。当为正数时(符号位为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=1739410650-Wk0KuXpE2XSGGJr6WkDwmlhDQ0N1tHgS-0-12bee8e8c8dde1a3d92cfaf83113c8b3)
【程序分析】本程序中,定义了两个无符号的整型变量x和y并赋值为60和13,通过移位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-7所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_13189.jpg?sign=1739410650-MTqgdrLdhlGOKpKmzXLRTLFBXGJGCD1w-0-6f232fe54e27e70ce95918f72b5cfec0)
图5-7 移位运算符
5.4.2 位运算符和位表达式
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_13192.jpg?sign=1739410650-syWFvSzZkumlGs0G0IutbtTkgpDqaYDA-0-e84761d843989b7ee0a83f079cae5ea8)
C++所支持的位运算符见表5-8。
表5-8 位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T87_13194.jpg?sign=1739410650-JFsZKOfG2Q0lVquj4pPXCuDK9JOYMt6d-0-8206a7cec4717923f8e0f28b53e48fc4)
在双目运算符中,位逻辑与的优先级最高,位逻辑或次之,位逻辑异或最低。
1. 按位与运算&
例如A=31、B=22,经过位逻辑与运算后得到的结果是22。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_72126.jpg?sign=1739410650-TsAuM9k8dVmViVOb5VXbpBg0thQm13nb-0-2c28629b68bd95115e04e25a310f46f5)
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_72127.jpg?sign=1739410650-acx82eSCWdTjkYVmFVLMLWHhXSCO4bNW-0-f8ccedf9c5940e07f0ad6aaffce5035c)
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=1739410650-NcPcoG1mSliqkF39kj0IUf3kBs3nKbVe-0-07a92001db483527f973dda627df9882)
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=1739410650-M9klPX5TmqwRdX9TkK0tZ3plOTfjBjkD-0-1ae9e5b455a6a80bab406923b8ecac63)
4. 按位取反运算~
例如,60取反运算后得到的结果是-61。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P88_72137.jpg?sign=1739410650-0ZNwFQEzu16DzGO93zFrZ2JZaQqe1hab-0-746ef19b83255e259932747edc3329a1)
按位取反运算符为单目运算符,运算对象就置于运算符的右边,具有右结合性。其功能是把运算对象的内容按位取反,即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=1739410650-MPGPzqFEdFlyFxEkgGkUEGKQ2TrCSPqn-0-780b5c19577f29e8ac2b54ecc2e9ed41)
【程序分析】本程序中,定义了两个无符号的整型变量A和B并赋值为31和22,通过位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-8所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P89_13350.jpg?sign=1739410650-mzNhLIIjnNbstAU8l7PGb0h77RDoTFj3-0-6f73b065df7ae1f41bcc15ccaf403ccc)
图5-8 位运算