异或以及一些小技巧
-
N = N ^ 0 0 = N ^ N
-
N >> 2 = N / 2 N << 2 = N * 2
-
说明>>与>>>的区别
'>> 不带符号位右移,即该数若为正数,则高位补0,若该数为负数,则高位补1
‘>>> 带符号位右移,即不管该数为正数还是负数,高位都不0
1000 >> 1 = 1100
0100 >> 1 = 0010
1000 >>> 1 = 0100
0100 >>> 1 = 0010
-
将某一个数 乘2加1: N = N * 2 + 1 相当于 N = N << 1 & 1
-
异或操作满足结合律与交换律:
a ^ b = b ^ a
a ^ b ^ c = a ^ (b ^ c)
总之若干个数进行异或操作,其结果与异或的顺序无关。
-
取某个数二进制表示,最右边为1的位置上为1,其余位置都补0表示的数:
x = (~N + 1) & N例: N=11000110, 结果 00000010
~N = 00111001
~N+1=00111010
(~N + 1) & N = 00000010
应用:
- 已知一个数组,其中有一个数是奇数个,其余的数全是偶数个,求奇数个的数?
public static void main(String[] args) {
int[] arr =</