在計算機內(nèi)存昂貴,處理能力有限的美好舊時光里,用比較黑客范的位運算方式去處理信息是首選方式(某些情況下只能如此)。時至今日,直接使用位運算仍然是很多計算領(lǐng)域中不可或缺的部分,例如底層系統(tǒng)編程,圖形處理,密碼學(xué)等。
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ù)。原因是當(dāng)一個數(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í)行按位或
操作?;叵胍幌?code>或操作符具備以下性質(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 ^^ ^
練習(xí)場中可運行范例。
在使用位掩碼技術(shù)為給定的整型數(shù)字設(shè)置任意位時,或
運算非常有用。例如,我們可以擴展之前的程序為變量 a
存儲的值設(shè)置