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