位运算符(&|^)
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.异或运算实现两数交换:
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)