按位与、按位或、按位异或、左移、右移【位运算详解基础+拓展】

三种位运算都是针对二进制来说的

取反:符号  ~           对一个二进制数取反只需将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<

8.取二进制数右数第k位   例:11110001->00000001            k=5

11110001&(11110001>>(k-1)&00000001

你可能感兴趣的:(#C语言,c语言,算法)