【笔记】位运算符——干货!

位运算符

<< >> ~ | ^ &

(<<)左移操作:等同于乘以2的n次方

(>>)右移操作:等同于除以2的n次方

(~)取反操作:按位取反运算符,0取反为1

(|)或操作:按位或运算符,一个为1 则为1

(^)异或操作:按位异或运算符,相异为1

(&)与操作:按位与运算符,全为1则为1

优先级:

2 3 4 5 8 9 10
~ * / % + - << >> & ^ |

常见的二进制位的变换操作

目的 释义 表示
去掉最后一位 101101->10110 x>>1
在最后加一个0 101101->1011010 x<<1
把最后一位变成1 101100->101101 x | 1
把最后一位变成0 101101->101100 (x |1) - 1
最后一位取反 101101->101100 x ^ 1
把右数第K位变成1 101001->101101,k=3 x | (1<<(k-1))
把右数第K位变成0 101101->101101,k=3 x & ~(1<<(k-1))
右数第k位取反 101001->101101,k=3 x ^ (1<<(k-1))
取末三位 1101101->101 x &7

 

&运算通常用于二进制取位操作,例如一个数 &1的结果就是取二进制的最末位。

这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数是偶数,最末位为1表示该数为奇数

| 运算通常用于二进制特定位上的无条件赋值,例如一个数|1的结果就是把二进制最末位强行变为1

如果需要把二进制最末位变成0,对这个数 |1之后再减一就可以了,其实际意义就是把这个数强行变成最近接的偶数

^运算通常用于对二进制的特定一位进行取反操作,^运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a^b)^b=a;

^运算可以用于简单的加密,比如原始值int a = 19880516;密钥 int key =1314520; 进行加密 int data=key^a = 20665500;解密 data^key == a;

^运算还可以实现两个值的交换而不需要中间变量 

<<运算

a<<b 表示把a转为二进制后左移b位(在后面添加 b个0)。例如100的二进制表示为1100100,100左移2位后(后面加2个零):1100100<<2 =110010000 =400,可以看出,a<<b的值实际上就是a乘以2的b次方,因为在二进制数后面添加一个0就相当该数乘以2,2个零即2的2次方 等于4。通常认为a<<1比a*2更快,因为前者是更底层一些的操作。因此程序中乘以2的操作尽量用左移一位来代替。

定义一些常量可能会用到<<运算。你可以方便的用1<<16 -1 来表示65535(unsingned int  最大值16位系统)。很多算法数据结构要求数据模块必须是2的幂,此时就可以用<<来定义MAX_N等常量。

>>运算

和<<相似,a>>b表示二进制右移b位(去掉末b位),相当于a除以2的b次方(取整)。我们经常用>>1来代替 /2(div 2),比如二分查找、堆的插入操作等等。想办法用>>代替除法运算可以使程序的效率大大提高。最大公约数的二进制算法用除以2操作来代替慢的出奇的%(mod)运算,效率可以提高60%。

 

 

例子

A = 0011 1100

B = 0000 1101

运算符 描述 实例
& 按位与操作,按二进制位进行"与"运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; (A & B) 将得到 12,即为 0000 1100
| 按位或运算符,按二进制位进行"或"运算。运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1; (A | B) 将得到 61,即为 0011 1101
^ 异或运算符,按二进制位进行"异或"运算。运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0; (A ^ B) 将得到 49,即为 0011 0001
~ 取反运算符,按二进制位进行"取反"运算。运算规则:~1=0; ~0=1; (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<< 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 A << 2 将得到 240,即为 1111 0000
>> 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 A >> 2 将得到 15,即为 0000 1111

猜你喜欢

转载自blog.csdn.net/weixin_44566432/article/details/113754598