& 按位与 全1为1,有0则0
| 按位或 有1则1,全0为0
^ 按位异或 相同为0,相异为1
~按位取反 1取反为0,0取反为1
<<按位左移 按位左移,低位补0 num << n <===> num *2^n
>>按位右移 按位右移动,有符号数高位补符号位:无符号数高位补0num > > n <===> num / 2^n
9&6
0000 0000 0000 0000 0000 0000 0000 1001
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0000
9 | 6
0000 0000 0000 0000 0000 0000 0000 1001
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 1111
9^6
0000 0000 0000 0000 0000 0000 0000 10010000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 1111
~9
~0000 0000 0000 0000 0000 0000 0000 10011111 1111 1111 1111 1111 1111 1111 0110
9 << 30000 0000 0000 0000 0000 0000 0000 1001 <<3
0000 0000 0000 0000 0000 0000 0100 1000
9>>30000 0000 0000 0000 0000 0000 0000 1001 >> 3
0000 0000 0000 0000 0000 0000 0000 0001
位运算的使用:
1.指定n位置1
0000 0000--》0000 1000
0000 0001 << 3
0000 1000
1010 0000 | 0000 1000
1010 1000 //低四位置1
num = num | 1 <<n;
1010 0001 | 0000 0001 << 6
0100 0000
1110 0001 //低六位置1
2.指定n位置0
1010 1010
1111 0111 == &~(1 << 3)
1010 0010 //低四位置0
1111 0111 <==> ~0000 1000 <==> ~(1 << 3)
num =num &~(1<< n);
0011 1100 1010 1010 & ~(1 << 10) & ~(1 << 11)
1111 1011 1111 1111
0011 1000 1010 1010
1111 0111 1111 1111
0011 0000 1010 1010 //置11和12位为0
3.两数交换(不使用中间变量)
a=a^b;
b=a^b;
a=a^b;
a^a==0a^0==a
b=(a ^ b ) ^ b = a ^ b ^ b = a ^ ( b ^ b ) = a ^ 0 = a;
a=a ^ b = a ^ b ^ a = 0 ^ b = b;
两数交换(中间变量):
int tmp = 0;tmp = a;
a=b;
b = tmp;
求和方式:
a=a+b;b=a- b; ===>a + b - b = a
a=a- b; ===>a + b - b =a + b - a
位运算符优先级:
~ 大于 << >> 大于 & 大于 ^ 大于 |