有人可以解释一下Golang中的左移/右移行为。请在此处参考示例代码:https://play.golang.org/p/7vjwCbOEkw

package main

import (
    "fmt"
)

func main() {
    var lf int8 = -3
    fmt.Printf("-3 : %08b\n", lf)
    fmt.Printf("<<1: %08b\n", lf<<1)
    fmt.Printf("<<2: %08b\n", lf<<2)
    fmt.Printf("<<3: %08b\n", lf<<3)
    fmt.Printf("<<4: %08b\n", lf<<4)
    fmt.Printf("<<5: %08b, %d\n", lf<<5, lf<<5)
    fmt.Printf("<<6: %08b, %d\n", lf<<6, lf<<6)
    fmt.Printf("<<7: %08b, %d\n", lf<<7, lf<<7)
    fmt.Printf("<<8: %08b, %d\n", lf<<8, lf<<8)
    fmt.Printf("<<9: %08b, %d\n", lf<<9, lf<<9)
}

-3 : -0000011
<<1: -0000110
<<2: -0001100
<<3: -0011000
<<4: -0110000
<<5: -1100000, -96
<<6: 01000000, 64
<<7: -10000000, -128
<<8: 00000000, 0
<<9: 00000000, 0

最佳答案

-3two's complement中是11111101,程序打印时看到的内容-0000011-,是数字的绝对值的二进制表示。在二进制补码中,最高位是0(表示正数(包括零))和1(表示负数)。如果将此数字(11111101)左移,则低7位向左移动一位,而0从右侧进入,替换最低位。如您在示例中所做的那样移动将导致:
11111101 -311111010 -611110100 -1211101000 -2411010000 -4810100000 -9601000000 6410000000 -12800000000 000000000 0...
您只需将所有位模式视为二进制补码,一旦知道其工作原理,一切都会变得有意义。

08-15 22:14