美文网首页Tips
Go 移位运算分析

Go 移位运算分析

作者: Sun东辉 | 来源:发表于2022-06-02 07:05 被阅读0次

Go 移位运算是一个效率很高的计算方式,根据场景进行使用,有时可以达到“出奇制胜”的效果。

在 《Go 程序设计语言》里是这样描述移位运算的:“左移以 0 填补右边空位,无符号整数右移同样以 0 填补左边空位,但有符号数的右移操作是按符号位的值填补空位。因此,请注意,如果将整数以位模式处理,须使用无符号整型”。

这里的意思很明确,如果不是无符号数,最好不要用移位运算,那么,到底是为什么呢?“有符号数的右移操作是按符号位的值填补空位”又是什么意思呢?

首先,我们看左移:

package main
import (
    "fmt"

    "github.com/imroc/biu" // 这里为了方便对比,引入第三方库
)

func main() {
    var i int8 = -9
    fmt.Println("original:", i)
    fmt.Printf("%s\\n", biu.ToBinaryString(i))
    r := i << 2
    fmt.Printf("%s\\n", biu.ToBinaryString(r))
    fmt.Println("result:", r)
}

/* 结果:
original: -9
11110111
11011100
result: -36
*/

完全符合预期,接着我们看右移:

package main
import (
    "fmt"

    "github.com/imroc/biu" // 这里为了方便对比,引入第三方库
)

func main() {
    var i int8 = -9
    fmt.Println("original:", i)
    fmt.Printf("%s\\n", biu.ToBinaryString(i))
    r := i >> 2
    fmt.Printf("%s\\n", biu.ToBinaryString(r))
    fmt.Println("result:", r)
}

/* 结果:
original: -9
11110111
11111101
result: -3
*/

纳尼?发生了什么?这里,其实发生了如下过程:

  1. 对 i 取补码,得到 00001001。
  2. 右移 2 位,得到 00000010。
  3. 再次取补码,得到 11111101。

那么,11111101 又是怎样得到 -3 值的,很简单,保留符号位,再次取补码就可以了,最后得到 1000011。

相关文章

  • Go 移位运算分析

    Go 移位运算是一个效率很高的计算方式,根据场景进行使用,有时可以达到“出奇制胜”的效果。 在 《Go 程序设计语...

  • Go的移位运算符的优先级比算术运算符大

    1.Go的移位运算符的优先级比算术运算符大,C++反之2.不管什么语言移位运算符前的运算都得加括号3.写go的快排...

  • 常见位运算及技巧

    移位运算 移位运算包含逻辑移位(logical shif) 和 算术移位(arithmetic shift)。 逻...

  • 位运算

    位运算包括逻辑运算和移位运算,相应地,位运算符包括逻辑运算符(包括~、&、|和^)和移位运算符(包括>>、<<和>...

  • 2018-04-24 JAVA 移位运算符

    移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。有三种移位运算符 (<<,>>,>>>...

  • Java移位运算

    背景 java或android源码中经常会使用移位运算来代替乘除运算,因为移位运算的性能比乘除运算的高(PS:对于...

  • 移位运算

    1,<< :左移运算符, System.out.println(1<<1);//2 System.out.prin...

  • 移位运算

    移位运算位自己在写遗传算法的代码的时候出现的,如下图所示,当j=0的时候,此时 zero_one = test_j...

  • 【移位运算】

    使用场景 ArrayList动态扩容,每次扩展50% 理论 oldCapacity右移1位 --> oldCapa...

  • 运算符

    位移位运算 如 UIViewAutoresizingFlexibleHeight = 1 << 4, 1.左移运算...

网友评论

    本文标题:Go 移位运算分析

    本文链接:https://www.haomeiwen.com/subject/gnnzprtx.html