三种位运算都是针对二进制来说的
取反:符号 ~ 对一个二进制数取反只需将0变1,1变0
例如:~11110000=00001111
按位与:符号 & 运算时二进制数都为1时结果才为1,其他情况为0。
二进制0&0=0 二进制1&1=1 二进制1&0=0
例子:12&13(实际在64位中,int整型占四个字节,下面为了方便假设整数占一个字节)
12的二进制数:00001100
13的二进制数:00001101
-----------------------------------------------------------
12&13结果为: 00001100 (十进制12)
按位或:符号 | 运算时只要有一个二进制数为1,结果都为1。只有两个二进制都为0时,结果才为0。
二进制1|1=1 二进制0|0=0 二进制0|1=1
例子:12|13
12的二进制数:00001100
13的二进制数:00001101
...............................................................
12|13的结果为:00001101(十进制13)
按位异或:符号^ 运算时二进制数相同为0,不同为1。
二进制1^1=0 二进制1^0=1 二进制0^0=0
例子:12^13
12的二进制数:00001100
13的二进制数:00001101
................................................................
12^13的结果为:00000001 (十进制1)
左移 :符号<< 二进制数左移k位,只需删除左k位,后补k个0
例子:00001010<<3=01010000 原来00001010十进制为10左移后为80相当于将原来的数乘2的k次方 10乘2的三次方等于80
右移 :符号>> 二进制数右移k位,只需删除右k位,前面补k个符号位
例子:00001010>>3 =00000001 原来00001010十进制为10右移后为1相当于将原来的数除以2的k次方 10除以2的三次方为1
拓展:
1.任何一个二进制数和二进制1按位或结果都为1
例如:0|1=1 1|1=1
2.任何一个二进制数和二进制0按位与结果都为0
例如:0&0=0 0&1=0
3.二进制0按位异或1得到1,二进制1按位异或1得到0【和二进制1按位异或得到取反值】
例如:1^1=0 0^1=1
4.任何一个二进制数&1结果都是它本身
例如:1&1=1 0&1=0
拓展+
1.将二进制最后一位变成0 例如:11110001->11110000
将最后一位变成0而前面几位数不发生改变只需要将11110001&11111110
111111110按位取反得00000001
所以11110001& ^(00000001)=11110000
2.将二进制最后一位取反 例如:11110001->11110000
所以11110001^00000001=11110000
3.将二进制x右数第k位变为1 例如:11110001->11110011 k=2
11110001 | (00000001<<(k-1))=11110011
4.将二进制数右数第k位变为0 例:11110001->11110001 k=2
11110001 &~(00000001<<(k-1))=11110011
5.将二进制数右数第k位取反 例:11110001->11110011 k=2
11110001 ^(00000001<<(k-1)) =11110011
6.取二进制数最右边的一位 例:11110001->00000001
11110001&00000001=00000001
7.取二进制数末k位 例:11110001->00000001 k=3
11110001&((1<<k)-1)=00000001
8.取二进制数右数第k位 例:11110001->00000001 k=5
11110001&(11110001>>(k-1)&00000001