284 字
1 分钟
理解Go位运算符
假定 A = 14, B = 11,转换为二进制:A = 1110,B = 1011。
| 运算 | 位3 | 位2 | 位1 | 位0 | 十进制 |
|---|---|---|---|---|---|
| A | 1 | 1 | 1 | 0 | 14 |
| B | 1 | 0 | 1 | 1 | 11 |
| A&B | 1 | 0 | 1 | 0 | 10 |
| A|B | 1 | 1 | 1 | 1 | 15 |
| A^B | 0 | 1 | 0 | 1 | 5 |
& 是求与,两个数都为 1 才为 1,其余情况为 0;
| 是求或,两个数都为 0 才为 0,其余情况为 1;
^ 是求异或,两个数相同时为 0,不同时为 1;
<< 左移运算,将数字的二进制左移 n 位,相当于乘以 2 的 n 次方,由 << 右边的数指定移动的位数,高位丢弃,低位补 0:
N * 2 等同于 N << 1
>> 右移运算,将数字的二进制右移 n 位,相当于除以 2 的 n 次方,由 >> 右边的数指定移动的位数:
N / 2 等同于 N >> 1
两个容易踩的点:Go 的
>>对有符号数是算术右移(高位补符号位),负数右移不等于向零取整的除法,比如-7 >> 1 == -4而-7 / 2 == -3;对无符号数才是逻辑右移。另外 Go 里^放在单个操作数前面是按位取反(其他语言多用~),&^则是 Go 特有的按位清除(AND NOT)。






