看mutex源码时,发现有很多的位操作,记一下加深印象
位运算都是在二进制的基础上进行运算的,所以在位运算之前要先将两个数转成二进制
<< >> 左移和右移运算符
左移运算符 << 是双目运算符。左移n位就是乘以2的n次方,其功能是把 << 左边的运算数的各二进位全部左移若干位,由 << 右边的数指定移动的位数,高位丢弃,低位补0
右移运算符 >> 是双目运算符。右移n位就是除以2的n次方,其功能是把 >> 左边的运算数的各二进位全部右移若干位,由 >> 右边的数指定移动的位数,低位丢弃,高位补0
应用举例:
1 | const ( |
& 位运算 AND
同一位都是1,结果才是1,否则为0
- 清零特定位(特定位置0,其它位为1)
- 取某数中指定位(特定位置1,其它位为0)
应用举例:
1 | // IsOdd 判断数字是否为奇数 |
~ 位运算 NOT
按位取反,0变1,1则变0
应用举例:
源码/补码/反码
| 位运算 OR
同一位都是0,结果才是0,否则为1
- 将某些位置1,其它位不变
应用举例:
1 | const ( |
^ 异或运算 XOR
同一位相同时结果为0,否则为1
- 将某些位翻转(特定位置1,其它位为0)
- 交换两个值,不用临时变量
- 异或满足交换律和结合律
x ^ x == 0
x ^ 0 == x
- 异或满足交换律和结合律
应用举例:
1 | func Swap(a, b int){ |
&^ 位清空运算符 AND NOT
z = x &^ y
如果 y 的位为 1 那么 z 对应的位是 0,否则 z 就使用 x 对应位的值
应用举例:
1 | func main() { |