需要掌握的位运算的几种用途
位操作只能用于整形数据
异或^
定义:两个位相同时位0,相异为1
特性:
一个整数与自己异或的结果是0
一个整数与0异或的结果是自己
异或操作满足交换律
想要某数的特定位翻转,就把特定位设置为1,与其异或:int类型A和-1,A^(-1=0xFFFFFFFF) 相当于对A进行取反。
实例:
可以用来交换两个整数
在数组中找到只出现一次的数字(其他数都是出现两次)
int类型的变量a求绝对值b:
i = a >> 31;
b = ((a ^ i) - i) ;
与&
定义:两个位均为1时,结果才为1.
特性:
取模转化为与位运算 a % (2^n) 等价于 a & (2^n - 1)(这里的^为 幂的意思)
a % 2 等价于 a & 1 ,
a % 4 等价于 a & 2 ,
a % 8 等价于 a & 3 ......
比如某short整数为x:
mask=1, x&mask 取得二进制的最低位是0还是1,从而判断x是奇数还是偶数。
mask=255, x&mask 保留了 x的低8位,高位都清零。
mask=x-1,x&x-1 是否为零来判断一个整数是不是2的幂。
mask=0xAAAA,x & 0xAAAA 即为取x的奇数位并将偶数位用0填充。
mask=0x5555,x & 0x5555 即为取x的偶数位并将奇数位用0填充。
右移>>
定义:各二进位全部右移若干位,对无符号数,高位补0,有符号数,vs中采用补符号位(算术右移)
实例:
计算nextPow2,详见此博客。
除法运算转化成右移位运算: a / (2^n) 等价于 a>> n
左移<<
乘法运算转化成左移位运算:a * (2^n) 等价于 a<< n
取反~
定义:0变1,1变0
特性:一个数的相反数 = 对一个数进行取反加1
多个位操作组合使用
1 . 取int型变量a的第k位
(k=0,1,2……sizeof(int)),即a>>k&1;
2 . 将int型变量a的第k位清0,即a=a&~(1<<k);
3 . 将int型变量a的第k位置1, 即a=a|(1<<k);
4 . 求两个数的平均值:((a&b) + ((a^b) >> 1));
5 . 交换shortx的奇偶位: ((x & 0xAAAA) >> 1) | ((x & 0x5555) << 1);
参考:
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