位运算应用口诀
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或
<< >> >>> | 左移乘2,右移除2,无符号右移 |
& | a&1判断最后1位/判断奇偶 |
^ | 同0异1,a&b无进位相加 |
~ | 负数=add(~a,1) |
优先级 | 描述 | 运算符 |
1 | 括号 | ()、[] |
2 | 正负号 | +、- |
3 | 自增自减,非 | ++、--、! |
4 | 乘除,取余 | *、/、% |
5 | 加减 | +、- |
6 | 移位运算 | <<、>>、>>> |
7 | 大小关系 | >、>=、<、<= |
8 | 相等关系 | ==、!= |
9 | 按位与 | & |
10 | 按位异或 | ^ |
11 | 按位或 | | |
12 | 逻辑与 | && |
13 | 逻辑或 | || |
14 | 条件运算 | ?: |
15 | 赋值运算 | =、+=、-=、*=、/=、%= |
16 | 位赋值运算 | &=、|=、<<=、>>=、 >>= |
左移与右移--<<(左移乘2)与>>(右移除2)
a<<n <=> a*(2^n) 例如:a<<1 <=> a*2
a>>n <=> a/(2^n) 例如:a>>1 <=> a/2
1>>n <=> 2^n
按位与-- &
1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)
例:将char型变量a的最低位置0:a=a&0376=a&11111110
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
例:char c;short int a;取出a的低字节放在c中:c=a&0377=a&0000000011111111
a%(2^n) <=> a&(2^n-1)
a&1 ===>判断a的最后1位是0还是1,也可判断奇偶(如果a最后一位为1就输出1,最后一位为0就输出0)
例如:a%2<=> a&1, 其中,a&1==0表示a为偶数,a&1==1表示a为奇数(”0偶1奇“)
a%4 <=> a&3
a%8 <=> a&7
a%16 <=> a&15
按位或-- |
常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
例:a=a|oxff=a|0000000011111111
位异或-- ^
1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
2 不引入第三变量,交换两个变量的值
void swap(int x , int y){
x ^= y; y ^= x; x ^= y;
}
注意:a^a=0 , a^0=a
按位取反--~
add(~a,1) =====>负数 等价于 a取反加1
~1不是-1,而是-2