284 字
1 分钟
理解Go位运算符

假定 A = 14, B = 11,转换为二进制:A = 1110,B = 1011。

运算位3位2位1位0十进制
A111014
B101111
A&B101010
A|B111115
A^B01015

& 是求与,两个数都为 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)。

理解Go位运算符
https://gilgameshzzz.github.io/posts/理解go位运算符/
作者
Amadeus
发布于
2019-07-08
许可协议
CC BY-NC-SA 4.0