位运算符(&|^)

1.按位与

&是按位与,对应位都为1时该位得1,否则得0。

i&(i-1) 表示将二进制表示的i 的最右边的1变为0。

&与&&不同,&&是逻辑运算。

 

(1).(i & (i - 1)) == 0)&&(i>0)  用来判断i是否是2的整数幂。

(2).&还用于屏蔽二进制的某些位,一个二进制数 &0是完全屏蔽,&1是不变。

 

2.按位或

只要参与运算的双方其中有一个是1,结果就是1.同0才为0

对于原二进制数来说,|0是不变,|1是置1.

类似上面,|0是不变,|1是变为0;

 

3.异或运算

同为0,不同为1.

 

零与任何数字进行异或运算,结果都是数字本身,0^x = x。

 

一个数字和自己做偶数次异或运算,结果为 0;

一个数字和自己做奇数次异或运算,结果为 1。

 

异或运算应用场景:

 

1.给你一个包含有 n - 1 个元素的数组,其中每个数字在 [1, n] 的范围内,且不重复。也就是从 1 到 n 这 n 个数字,有一个数字没有出现在这个数组中。编写一个算法,找到这个丢失的数字。

 

 解:1~n所有数字与数组的所有数字全部进行异或运算,结果即为缺失数字。

 

1 ^ 2 ^ 3 ^ ... ^ n ^ A[0] ^ A[1] ^ A[2] ^ ... ^ A[n - 2](出现两次的数字运算结果都是0,只出现一次的数字与0进行异或运算得到本身)

 

 

 

2.异或运算实现两数交换:
if(x != y){ (只有x,y是不同地址时,此算法成立,因此加上if判断)    
  x ^= y; 
  y ^= x; 
  x ^= y;}或去掉if判断:
(x == y) || ((x ^= y), (y ^= x), (x ^= y))




4.位移位运算符

位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。


移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)(具体见https://baike.baidu.com/item/%E5%8F%B3%E7%A7%BB%E8%BF%90%E7%AE%97%E7%AC%A6/3828526?fr=aladdin
 

左移补0,换算十进制的话是原来数值的2倍。

右移看符号位:负数补1,正数补0,换算为十进制数值变为原来的1/2.

(左乘右除)

 x >> 1 等同于 x = x/2;
这是位运算, >>左移运算,<< 右移运算
x >> n 等同于 x / (2^n)
x << n 等同于 x * (2^n)

posted @ 2021-03-03 19:57  助手的fork  阅读(491)  评论(0编辑  收藏  举报