![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=1739255744-r4KFeuJXdxVYi4WDrYcaX1t1nPL54Y1m-0-7530d257a3d59f5c08e209b8a629d2d3)
5.4.1 移位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72114.jpg?sign=1739255744-4LLs4I6y6NuknogPT8NQXn3duFK18uIf-0-880e40fbb7e3a88af4408c6e4d1a94cc)
C++中的移位运算符包括左移“<<”和右移“>>”,见表5-7。
表5-7 移位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T86_72116.jpg?sign=1739255744-I6R60a7tTBMphkeaH1fEBahTyb76iEY2-0-0125d17283547f386c86c9c3dafa0a3e)
1. 左移运算符
左移运算符用来把“<<”左边的运算数的各二进制位全部左移若干位,移动的位数由“<<”右边的数指定。左移时,高位移出的部分舍弃,低位补0。
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72117.jpg?sign=1739255744-Xzh2GHIayUaq7KyLigsGWwxG7YY8TnIU-0-3689f681c9c076ddea8a7d91bb12b7bc)
用二进制表示运算过程如下:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_73240.jpg?sign=1739255744-dIjHfYYq9t35AClpXCAHTgIsObToEAN3-0-0530a01a1a7f084fa344f0c7327a4a70)
2. 右移运算符
右移运算符用来把“>>”左边的运算数的各二进制位全部右移若干位,移动的位数由“>>”右边的数字指定。右移时,低位移出的二进制数舍弃,左端移入的二进制数分两种情况:对于无符号整数和正整数,高位补0,对于负整数,高位补1,这是因为负数在机器内均用补码表示。
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_72118.jpg?sign=1739255744-uB1aoGJmYjWEGYpuTpjg75iaRrsVttpv-0-053804fb79f2dcaa8631031c4dcd894b)
用二进制表示运算过程如下:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P86_73242.jpg?sign=1739255744-nAbkFTJOe4L96yKttvcu0wkobpPwhvCz-0-4f40e8be791cffeccd7b7d1061512605)
右移时要注意符号位,对于有符号的数,右移时符号位将一同移动。当为正数时(符号位为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=1739255744-bi6jwWvIYKPiQCTZVdHjFF3aXPe8QCFG-0-119b3c6d63912a565baeb91b3be6a74c)
【程序分析】本程序中,定义了两个无符号的整型变量x和y并赋值为60和13,通过移位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-7所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_13189.jpg?sign=1739255744-YDu8rMHugPfJBsXl1TA1XmAd2yUGKwD6-0-d5dad7ae3f50238560dc64b7e708bcef)
图5-7 移位运算符
5.4.2 位运算符和位表达式
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_13192.jpg?sign=1739255744-r57g7d15FnXbsFXdcfpCBq2lBPJGzdz6-0-da74b5ba93568a14d28a860aeb57b3d6)
C++所支持的位运算符见表5-8。
表5-8 位运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T87_13194.jpg?sign=1739255744-szjp1HuX1vhRBQbKvNwSoaNXkTShb4w8-0-a732d8edeb649485834481e2fa0ff1c4)
在双目运算符中,位逻辑与的优先级最高,位逻辑或次之,位逻辑异或最低。
1. 按位与运算&
例如A=31、B=22,经过位逻辑与运算后得到的结果是22。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_72126.jpg?sign=1739255744-oCERkEjtA6RefekRlruBinLvt8YLZcFM-0-ec32259e6954fc25118b4a6c82dbce85)
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P87_72127.jpg?sign=1739255744-AZbUQIjy2vx3u9C0D9lqP07p3TfidZkD-0-3d63ead072e6345c3cec4762c2157896)
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=1739255744-5f6YQBoSOXg3KO0O2gmcGxH8Tn1ti2yJ-0-fbe75b6bc74da7dc2022bf2faa2b06ed)
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=1739255744-U4PywVhx0DVJCQsqPwsEQAv797AEfw3R-0-92ef1f953332e55e9c78857f22098d42)
4. 按位取反运算~
例如,60取反运算后得到的结果是-61。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P88_72137.jpg?sign=1739255744-g8RizxnVTEjy73JiamqMNjY6bq94283U-0-c77270e477ba47a194ae0401e807ed47)
按位取反运算符为单目运算符,运算对象就置于运算符的右边,具有右结合性。其功能是把运算对象的内容按位取反,即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=1739255744-2JfENNfFRkGLdySQoyqvNztPoUgl0XRQ-0-ac222ca31cf44d8ba3f074e2461c08fc)
【程序分析】本程序中,定义了两个无符号的整型变量A和B并赋值为31和22,通过位运算符对两个变量进行操作。
在Visual Studio 2017中的运行结果如图5-8所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P89_13350.jpg?sign=1739255744-3RC9KCGNPFU4aCGfheV2HDbJqXQ12qQ9-0-dd0f04d3da313ba140a7dd28bfe786a6)
图5-8 位运算