位运算
位运算符 | 含义 | 举例 |
---|---|---|
& | 按位与 | a&b |
| | 按位或 | a|b |
^ | 按位异或 | a^b |
~ | 按位取反 | ~a |
<< | 左移 | a<<1 |
>> | 右移 | b>>2 |
按位取反 ~
- 将数据的二进制位取反,0变1,1变0.
按位与 &
-
两个数的二进制,同时为1才为1,否则为0(否则包括 01 10 00)
-
主要用途
- 将一个单元格清零: x=1010 1000 y=0000 0000 ,x&y=0000 0000
- 取出一个数的指定位: x=1010 1110,取后4位,令y=0000 1111, x&y=0000 1110
- 判断奇偶:根据末尾为0(偶数)还是1(奇数)决定, if(a & 1) 为奇数是真.
按位或 |
-
两个数的二进制,同为0才是0,否则为1(否则包括 01 10 11)
a:0111 1010 b:1001 1000 |:1111 1010
-
主要用途
- 对于一些数据的某些位设置成1: x=1010 1110,后四位设置成1.令y=0000 1111 ,x|y=1010 1111
按位异或
-
两个数的二进制,相同为0,不同为1
-
主要用途
- 反转指定位: x=1010 1110,后四位翻转,令y=0000 1111,x^y=1010 0001.
- 与0相异或值不变
- 交换两个数:a=b;b=a;a^=b;
左移
-
将一个运算对象的二进制位全部左移若干位,左边的二进制位丢失,右边补0
a:1010 1110 a=a<<2; a:1011 1000 //若左移舍弃的高位不包括1,则每左移一位,相当于该数*2 //m*2^n == m<<n
右移
-
右移就是直接/2,不用担心溢出,产生的小数部分直接丢弃
-
若是带符号位,符号位空位正数补0,负数补1
-
牵扯到负数要注意原码反码补码的问题
//当a为负 a:0000 1011 a反码:1111 0100 a补码:1111 0101 a=a>>1; a补码=1111 1010 //最高位是1,确定为负数 a取反+1=0000 0110 a=-6
位运算符可以化简写:
化简 | 原形式 |
---|---|
a&=b | a=a&b |
a|=b | a=a|b |
a^=b | a=a^b |
a<<=b | a=a<<b |
a>>=b | a=a>>b |
一些基础的位运算操作
描述 | 写法 |
---|---|
去掉最后一位 | x >> 1 |
在最后加一个0 | x << 1 |
在最后加一个1 | (x<< 1)+1 |
把最后一位变成1 | x | 1 |
把最后一位变成0 | (x | 1) - 1 |
最后一位取反 | x ^ 1 |
把右数第k位变成1 x x | x | (1 << (k-1)) |
把右数第k位变成0 | x & (~ (1 << (k-1))) |
右数第k位取反 | x ^ (1 << (k-1)) |