计算机的所有运算都是以补码在运算。
1 & (按位与) : 两位全为1,则结果为1,否则为0
a := 1 补码为 0001
b := 2 补码: 0010
推导为===> 0000
fmt.Println(a & b) // 0
c := 2 // 0010
d := 3 // 0011
推导同为1的二进制位:0010 所以结果为:2
fmt.Println(a & b) // 2
2 | (按位或) : 两位其中有一位为1就为1,结果则为1,否则就为0
2 的补码为:0010
3 的补码为:0011 ===> 0011
fmt.Println(2 | 3) // 3
3 相异或运算: 当对应二进制位不同时结果为1,相同时为0
2 补码为0010
3 补码:0011
===> 0001
fmt.Println(2 ^ 3) // 1
左移 <<
左移2位,高位丢弃,低位补0
1 补码:0001
2 补码:0010
===> 往左移2位:0100
fmt.Println(1 << 2) // 4
右移>> 就是除以N次方
1 补码:0001
2 补码:0010
1移2位==> 0000,所以最终是0
fmt.Println(1 >> 2) // 0
4 补码:0100
2 补码:0010
==> 0001 0000
fmt.Println(4 << 2) // 16