// 第一部分 左移和右移
// <<
1 << i = 2 ^ i; // 在1后面添加i个0,相当于给1乘了i个2
i << j = i * (2 ^ j); // 原理同上
// >>
1 >> i = 0 ;
i >> j = i / (2 ^ j);
// 巧妙的应用
i << 1 = i * 2; // 位运算的速度比i*2快
i >> 1 = i / 2; // 位运算的速度比i/2快
//第二部分 与、或、异或
// &
(bool) i & 1 -> i是否是奇数 是奇数则为true
(bool) i & 0 -> i是否是偶数 是偶数则为true
// |
i | 1 == 1 | i -> 把一个偶数+1,奇数不变
// ^
a ^= b,b ^= a,a ^= b; -> swap(a,b);
//第三部分 位运算的结合
int binaryABS(int x) {
int j = x >> 31;
return (x + y) ^ y;
}
int binaryGCD(int x,int y){
int i,j;
for(i=0;(x&1)==0;i++) x>>=1;
for(j=0;(y&1)==0;j++) y>>=1;
if(i>j) i=j;
while(1){
if(x<y) x^=y,y^=x,x^=y;
if((x-=y)==0) return y<<i;
while((x&1)==0)) x>>=1;
}
}
int binaryReverse(int x){
return ~x+1;
}
int binaryAverage(int x,int y){
return (x&y)+((x^y)>>1);
}