位操作常见用途介绍

需要掌握的位运算的几种用途

位操作只能用于整形数据


异或^

定义:两个位相同时位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 ...... 


通过设计好的mask,进行对某数进行取值。

比如某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


猜你喜欢

转载自blog.csdn.net/u012138730/article/details/80255686