站长资讯网
最全最丰富的资讯网站

浅析Golang中的的位操作(按位运算符)

浅析Golang中的的位操作(按位运算符)

在计算机内存昂贵,处理能力有限的美好旧时光里,用比较黑客范的位运算方式去处理信息是首选方式(某些情况下只能如此)。时至今日,直接使用位运算仍然是很多计算领域中不可或缺的部分,例如底层系统编程,图形处理,密码学等。

Go 编程语言支持以下按位运算符:

&   bitwise AND  |   bitwise OR  ^   bitwise XOR &^   AND NOT <<   left shift >>   right shift
登录后复制

本文的余下部分详述了每个操作符以及它们如何使用的案例。

& 运算符

在 Go 中, & 运算符在两个整型操作数中执行按位 AND 操作。AND 操作具有以下属性:

Given operands a, b AND(a, b) = 1; only if a = b = 1                else = 0
登录后复制

AND 运算符具有选择性的把整型数据的位清除为 0 的好的效果。 例如,我们可以使用 & 运算符去清除(设置)最后 4 个最低有效位(LSB)全部为 0 。

func main() {     var x uint8 = 0xAC    // x = 10101100     x = x & 0xF0          // x = 10100000 }
登录后复制

所有的位运算都支持简写的赋值形式。 例如,前面的例子可以重写为如下。

func main() {     var x uint8 = 0xAC    // x = 10101100     x &= 0xF0             // x = 10100000 }
登录后复制

另外一个巧妙的技巧是:你可以用 & 操作去测试一个数字是奇数还是偶数。原因是当一个数字的二进制的最低位是 1 的时候,那他就是奇数。我们可以用一个数字和 1 进行 & 操作,然后在和 1 做 AND 运算,如果的到的结果是 1 ,那么这个原始的数字就是奇数

import (     "fmt"     "math/rand" ) func main() {     for x := 0; x < 100; x++ {         num := rand.Int()         if num&1 == 1 {             fmt.Printf("%d is oddn", num)         } else {             fmt.Printf("%d is evenn", num)         }     } }
登录后复制

在 Playground 上运行上面的例子

| 操作符

| 对其整型操作数执行按位操作。回想一下操作符具备以下性质:

Given operands a, b OR(a, b) = 1; when a = 1 or b = 1               else = 0
登录后复制

我们可以利用按位操作符为给定的整数有选择地设置单个位。例如,在如下示例中我们使用按位将示例数(从低位到高位(MSB))中的第 3 ,第 7 和第 8 位置为 1 。

func main() {     var a uint8 = 0     a |= 196     fmt.Printf("%b", a) }  // 打印结果  11000100             ^^   ^
登录后复制

练习场中可运行范例。

在使用位掩码技术为给定的整型数字设置任意位时,运算非常有用。例如,我们可以扩展之前的程序为变量 a 存储的值设置

赞(0)
分享到: 更多 (0)