
在計算機內(nèi)存昂貴,處理能力有限的美好舊時光里,用比較黑客范的位運算方式去處理信息是首選方式(某些情況下只能如此)。時至今日,直接使用位運算仍然是很多計算領(lǐng)域中不可或缺的部分,例如底層系統(tǒng)編程,圖形處理,密碼學等。
Go 編程語言支持以下按位運算符:
& bitwise AND | bitwise OR ^ bitwise XOR &^ AND NOT << left shift >> right shift
本文的余下部分詳述了每個操作符以及它們?nèi)绾问褂玫陌咐?/p>
& 運算符
在 Go 中,  & 運算符在兩個整型操作數(shù)中執(zhí)行按位 AND 操作。AND 操作具有以下屬性:
Given operands a, b AND(a, b) = 1; only if a = b = 1 else = 0
AND 運算符具有選擇性的把整型數(shù)據(jù)的位清除為 0 的好的效果。 例如,我們可以使用  & 運算符去清除(設(shè)置)最后 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 }
另外一個巧妙的技巧是:你可以用 & 操作去測試一個數(shù)字是奇數(shù)還是偶數(shù)。原因是當一個數(shù)字的二進制的最低位是 1 的時候,那他就是奇數(shù)。我們可以用一個數(shù)字和 1 進行 & 操作,然后在和 1 做 AND 運算,如果的到的結(jié)果是 1 ,那么這個原始的數(shù)字就是奇數(shù)
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 上運行上面的例子
| 操作符
| 對其整型操作數(shù)執(zhí)行按位或操作。回想一下或操作符具備以下性質(zhì):
Given operands a, b OR(a, b) = 1; when a = 1 or b = 1 else = 0
我們可以利用按位或操作符為給定的整數(shù)有選擇地設(shè)置單個位。例如,在如下示例中我們使用按位或將示例數(shù)(從低位到高位(MSB))中的第 3 ,第 7 和第 8 位置為 1 。
func main() {     var a uint8 = 0     a |= 196     fmt.Printf("%b", a) }  // 打印結(jié)果  11000100             ^^   ^
練習場中可運行范例。
在使用位掩碼技術(shù)為給定的整型數(shù)字設(shè)置任意位時,或運算非常有用。例如,我們可以擴展之前的程序為變量 a 存儲的值設(shè)置
站長資訊網(wǎng)