
在計算機內存昂貴,處理能力有限的美好舊時光里,用比較黑客范的位運算方式去處理信息是首選方式(某些情況下只能如此)。時至今日,直接使用位運算仍然是很多計算領域中不可或缺的部分,例如底層系統編程,圖形處理,密碼學等。
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 存儲的值設置
站長資訊網