package main
import "fmt"
func main() {
// 正数的源码 反码 补码 一致
// 2的源码 0000 0010 反码 0000 0010 补码 0000 0010
// 负数的源码符号位为1 反码=符号位不变, 其他位取反 补码=反码+1
// -2的源码 1000 0010 反码 1111 1101 补码 1111 1110
// 0的源码 反码 补码都是0
// 1.按位与&:两位全为1, 结果为1, 否则为0
// 2&3
// 2的源码 0000 0010 反码 0000 0010 补码 0000 0010
// 3的源码 0000 0011 反码 0000 0011 补码 0000 0011
// 2&3 = 0000 0010
fmt.Println("2&3:", 2&3)
// 2.按位或|:两位有一位为1, 结果为1, 否则为0
// 2|3
// 2的源码 0000 0010 反码 0000 0010 补码 0000 0010
// 3的源码 0000 0011 反码 0000 0011 补码 0000 0011
// 2|3 = 0000 0011
fmt.Println("2|3:", 2|3)
// 3.按位异或^:两位有一位为1, 一位为0, 结果为1, 否则为0
// 2^3
// 2的源码 0000 0010 反码 0000 0010 补码 0000 0010
// 3的源码 0000 0011 反码 0000 0011 补码 0000 0011
// 2^3 = 0000 0001
fmt.Println("2^3:", 2^3)
// -2^2
// -2的源码 1000 0010 反码 1111 1101 补码 1111 1110
// 2的源码 0000 0010 反码 0000 0010 补码 0000 0010
// -2^2 = 1111 1100<补码>->1111 1011<反码>->1000 0100<源码>
fmt.Println("-2^2:", -2^2)
// 4.左移运算符 <<: 符号位不变, 高位溢出, 低位补0
// 2 << 2
// 2的源码 0000 0010 反码 0000 0010 补码 0000 0010
// 2 << 2 = 0000 1000
fmt.Println("2<<2:", 2<<2)
// -2 << 2
// -2的源码 1000 0010 反码 1111 1101 补码 1111 1110
// -2 << 2 = 1111 1000<补码>-> 1111 0111<反码>->1000 1000<源码> = -8
fmt.Println("-2<<2:", -2<<2)
// 5.又移运算符 >>: 符号位不变, 低位溢出, 并用符号位补溢出的高位
// 2 >> 2
// 2的源码 0000 0010 反码 0000 0010 补码 0000 0010
// 2 >> 2 = 0000 0000 = 0
fmt.Println("2>>2:", 2>>2)
// -2 >> 2
// -2的源码 1000 0010 反码 1111 1101 补码 1111 1110
// -2 >> 2 = 1111 1111<补码>->1111 1110<反码>-> 1000 0001<源码> = -1
fmt.Println("-2>>2:", -2>>2)
}
有疑问加站长微信联系(非本文作者)