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