目录
位操作
名称 | 运算规则 | 特性 | 实例 |
异或^ | 两个位相同时位0,相异为1 | 1.一个整数与自己异或的结果是0。 2.一个整数与0异或的结果是自己。 3.异或操作满足交换律。 4.与一个只有特定位是1的数进行异或就能翻转特定位。
| 1.在数组中找到只出现一次的数字(其他数都是出现两次)(特性1)。 2.用来交换两个整数a,b(特性1,2,3): a ^= b;b ^= a;a ^= b; 3.a的所有位翻转b(特性4): b= a^(-1=0xFFFFFFFF); |
与& | 两个位均为1时,结果才为1 | 除数是2次幂的取模运算: a % (2^n) 等价于 a & (2^n - 1): a % 2 等价于 a & 1 , a % 4 等价于 a & 2 , a % 8 等价于 a & 3 | 通过设计好的mask,进行对x进行操作: 1.判断x是偶数还是奇数: x&1=0偶数,-1奇数。 2.取低位8bit,高位清0:x&255 3.判断一个整数是不是2的幂:x&x-1 = 0是2的幂,否则不是。 4.取x的奇数位并将偶数位用0填充:x & 0xAAAA 5.取x的偶数位并将奇数位用0填充:x & 0x5555 |
右移>> | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,vs中采用补符号位(算术右移) | 除数是2次幂的除法运算: a / (2^n) 等价于 a>> n | 计算nextPow2,详见此博客。 |
左移<< | 各二进位全部左移若干位,高位丢弃,低位补0 | 乘数是2次幂的乘法运算: a * (2^n) 等价于 a<< n | |
取反~ | 0变1,1变0 | 一个数的相反数 = 对一个数进行取反加1 |
常用操作
取int型变量a的第k位(k=0,1,2……sizeof(int) -1) | a>>k&1; |
将int型变量a的第k位清0 | a=a&~(1<<k); |
将int型变量a的第k位置1 | a=a|(1<<k); |
求两个数的平均值 | ((a&b) + ((a^b) >> 1)); |
交换shortx的奇偶位 | ((x & 0xAAAA) >> 1) | ((x & 0x5555) << 1); |
int类型的变量a求绝对值b | i = a >> 31;b = ((a ^ i) - i) ; |
参考:
https://blog.yangx.site/2016/07/06/bit-operation-skills/
https://blog.csdn.net/hguisu/article/details/7892596
https://blog.csdn.net/morewindows/article/details/7354571