
【编程】C++入门:位运算(&、|、^、~、>>、<<)
发布日期:2021-05-12 12:42:15
浏览次数:17
分类:精选文章
本文共 1718 字,大约阅读时间需要 5 分钟。
位运算符及移位操作
1. 按位与运算符(&)
运算规则
按位与运算的规则很简单:两个数在同一二进制位上都为1时,结果为1;否则,结果为0。
对于负数来说,按位与运算需要用补码形式进行计算。这意味着在处理负数时,需要额外考虑二进制数的符号位。运算用途
清零
想将一个数的某些位清零,可以通过与一个掩码进行按位与运算。例如,用掩码0x00001111
与数0x12345678
进行按位与运算,可以得到清零后的低24位结果0x00004678
。 提取指定位
想只保留一个数的某些位,可以通过设计一个掩码(所有需要保留的位为1,其余为0)。例如,想提取一个数X
的低4位,可以使用掩码0x00001111
进行按位与运算,得到结果X & 0x00001111
。 判断奇偶性
通过按位与1的结果来判断奇偶性。例如,判断一个数a
是否为偶数,只需检查a & 1
是否为0: if ((a & 1) == 0) { // 代表a是偶数 }
2. 按位或运算符(|)
运算规则
按位或运算的规则是:只要两个数中至少有一个为1,结果为1;否则,结果为0。
同样,负数按位或运算也使用补码形式。这意味着在处理负数时,符号位的变化会影响结果。运算用途
设置指定位
想将一个数的某些位设置为1,可以通过设计一个掩码(所有需要设置的位为1,其余为0)。例如,想将数X
的低4位设置为1,可以使用掩码0x00001111
进行按位或运算,得到结果X | 0x00001111
。 拓展二进制数
通过按位或运算可以简单地增加二进制数的位数。例如,一个8位数0xFF
与0x00
进行按位或运算,结果仍然是0xFF
。 处理符号位
在有符号数中,按位或运算可以用来改变数字的符号。例如,一个负数-123
(补码形式下为11111111 11111111 11111101
)与0x80000000
(负数表示为10000000 00000000 00000000
)进行按位或运算,可以将原数的负号扩展到高位,得到-32767
。 3. 异或运算符(^)
运算规则
异或运算的规则是:两个数在同一二进制位上都为0,结果为0;都为1,结果为1;一方为1另一方为0,结果为1。
异或运算的计算方式类似于“异或”电路,两个输入信号不同则输出信号为1。运算用途
翻转指定位
想将一个数的某个位从0翻转为1(或1翻转为0),可以使用异或运算。例如,将X = 0xA
(二进制1010
)与0xA
异或,结果为0x0
(二进制0000
)。 Want to flip a specific bit from 0 to 1 or 1 to 0: 例如,想翻转X = 0xA
(二进制1010
)的最低位,可以使用异或操作: X = X ^ 1
与0异或不变
当一个数与0异或时,结果不变。例如:0b1010 ^ 0b0000 = 0b1010
交换两个数
想交换两个数的值,可以利用异或运算。例如,实现一个简单的交换函数:void Swap(int a, int b) { if (a != b) { a = a ^ b; b = a ^ b; a = a ^ b; }
4. 左移运算符(<<)
左移运算符<<
用于将一个整数的二进制位向左移动指定的位数。在左移时,丢弃被移出的最高位,并在最低位补充与原数值无关的新的0。
示例
5 << 2
(二进制101
左移两位): 丢弃左移前的最高位1
,结果变为1010
(即10)。-5 << 2
: 如果是有符号数,左移时最高位会被原符号位(1)填充。 二进制...11111011
左移两位后变为...111110110
。
5. 右移运算符(>>>)
右移运算符>>>
用于将一个整数的二进制位向右移动指定的位数。在右移时,丢弃被移出的最低位,并根据是否是有符号数填充移出的最高位。
示例
5 >> 2
(二进制101
右移两位): 丢弃最低位1
,结果变为101
(即2)。-5 >> 2
: 如果是有符号数,右移时填充最高位的0
。 二进制...11111011
右移两位后变为...00000111
。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月21日 08时24分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Centos 7.3 计算本目录下的以特定名字文件夹个数
2019-03-09
linux下编程出现 对'sem_wait'未定义的引用解决方案
2019-03-09
ccf小明种苹果
2019-03-09
[C++系列] 48. string类基础知识点
2019-03-09
[每日一题] 66. 客似云来(fib数列公式)
2019-03-09
[每日一题] 85. 红与黑(图、DFS)
2019-03-09
[排序算法] 4. 希尔排序(插入排序)
2019-03-09
[每日一题] 151. 只出现一次的数字(位运算、异或、常规解法)
2019-03-09
[LeetCode 双周赛22] 2. 安排电影院座位(排序、暴力优化、巧妙解法)
2019-03-09
[LeetCode 周赛181] 2. 四因数(暴力、常规解法)
2019-03-09
[M图论+bfs] lc127. 单词接龙(图论难题+建图+bfs求最短路)
2019-03-09
[M模拟] lc48. 旋转图像(模拟+思维)
2019-03-09
form表单
2019-03-09
JavaFX学习笔记-颜色选择器ColorPicker与日期选择器DatePicker
2019-03-09
使用Java在Windows上获取一个文件的创建时间
2019-03-09
Flutter学习笔记-主轴与交叉轴的对其方式
2019-03-09
工具研究:(三)Nginx配置错误的路由时均统一跳转到登录界面
2019-03-09
数据库设计原则与编写sql规范要求-据于阿里开发手册简化
2019-03-09
ant design pro v5去掉右边content区域的水印
2019-03-09