---------------start reading---------------
前言
作为一个C语言的小白,位运算的重要性还不能深深地感受,不过等到以后接触了linux,实行大小端转换……就要运用到很多位运算,所以,位运算是非常重要的!
位运算实际上就是二进制的计算,下面我来介绍一下位运算的相关知识
~ 按位取反
10: 0000 1010
~10 = 1111 0101
*二进制的负数转正数,正数转负数,都是先取反再加一
& 按位与
每一位按布尔法则表,相同位为1则为1否则为0
10: 0000 1010
13 : 0000 1101
10&13= 0000 1000
| 按位或
相同位有一个为1则为1
10 : 0000 1010
12 : 0000 1100
10|13= 0000 1110
^ 按位异或
相同位上不一样为1,一样为0
10: 0000 1010
13: 0000 1101
10^13= 0000 0111
<< 按位左移
二进制数最高位向左移,右边补零(相当于扩大数字的2n倍)
10 : 0000 1010
10<<1 0001 0100
10<<2 0010 1000
>>按位右移
二进制数最低位向右移(扔尾数),左边补符号位(正数补0,负数补1)
10: 0000 1010
-10: 1111 0110
10>>2= 0000 0010
-10>>2= 1111 1101
下面我们来看一些常见的二进制位的操作
- 去掉最后一位 | (101101->10110) |
- 在最后加一个0 | (101101->1011010) |
- 在最后加一个1 | (101101->1011011) |
- 把最后一位变成1 | (101100->101101) |
- 把最后一位变成0 | (101101->101100) |
- 最后一位取反 | (101101->101100) |
- 把右数第k位变成1 | (101001->101101,k=3) |
- 把右数第k位变成0 | (101101->101001,k=3) |
- 右数第k位取反 | (101001->101101,k=3) |
- 取末三位 | (1101101->101) |
- 取末k位 | (1101101->1101,k=4) |
- 取右数第k位 | (1101101->1,k=4) |
- 把右边连续的1变成0 | (100101111->100100000) |
- 把右起第一个0变成1 | (100101111->100111111) |
- 把右边连续的0变成1 | (11011000->11011111) |
思考一下吧!!!
小可爱!!!!
具体操作
- 去掉最后一位 | (101101->10110) | x >> 1
- 在最后加一个0 | (101101->1011010) | x << 1
- 在最后加一个1 | (101101->1011011) | (x << 1)|1
- 把最后一位变成1 | (101100->101101) | x | 1
- 把最后一位变成0 | (101101->101100) | (x | 1)-1或者
- 最后一位取反 | (101101->101100) | x ^ 1
- 把右数第k位变成1 | (101001->101101,k=3) | x | (1 << (k-1))
- 把右数第k位变成0 | (101101->101001,k=3) | x & ~(1 << (k-1))
- 右数第k位取反 | (101001->101101,k=3) | x ^ (1 << (k-1))
- 取末三位 | (1101101->101) | x & 7
- 取末k位 | (1101101->1101,k=4) | x & ((1 << k)-1)
- 取右数第k位 | (1101101->1,k=4) | (x >> (k-1)) & 1
- 把右边连续的1变成0 | (100101111->100100000) | x & (x+1)
- 把右起第一个0变成1 | (100101111->100111111) | x | (x+1)
- 把右边连续的0变成1 | (11011000->11011111) | x | (x-1)
这就是一些基本的位运算的用法了,希望对大家有帮助。
-----------------end---------------------------