常見的golang位運算符:
& 位與(bitwise AND)
| 位或 (bitwise OR)
^ 位異或 (bitwise XOR)
&^ 位清空 (AND NOT)
>> 左移 integer >> unsigned integer
<< 右移 integer << unsigned integer

&, |, << 和 >> 都是常見的運算符,主要說明 ^, &^的使用進行說明
-
^作為一元運算符時表示位反或位補
當(dāng)作為一元運算符的時候,進行運算時,對其補充一個操作數(shù) m; 如 ^n等價于m ^ n, 然后進行二元計算; 其中m和n 同類型, 并且規(guī)定 當(dāng)m是有符號整數(shù)時,m = -1;當(dāng)m是無符號整數(shù)時,m所有bit位都是 1。
比如如果n的類型為int8,則m的值為-1;如果n的類型為uint8,則m的值為255。
-
&^位清空運算
這個運算和被運算變量位置有關(guān)系,先看一個例子
package main
import "fmt"
func main() {
x := 2
y := 4
fmt.Println(x&^y)
}
output: 2
計算 x&^y 首先我們先換算成2進制 0000 0010 &^ 0000 0100 = 0000 0010, 表示如果 y 中的 bit 位為 1,則 z 對應(yīng) bit 位為 0,否則 z 對應(yīng) bit 位等于 x 中相應(yīng)的 bit 位的值。
一些涉及到位運算的基礎(chǔ)概念
真值, 原碼,反碼,補碼
為了讓符號位參與基本預(yù)算,產(chǎn)生了反碼;
為了解決反碼運算后產(chǎn)生-0的問題產(chǎn)生了補碼;
計算機實際用補碼參與運算,獲得的結(jié)果需要轉(zhuǎn)換成原碼。
真值: 有符號數(shù)二進制位左邊第一個符號位置0后得到的值。
原碼: 符號位加真值的絕對值。
反碼: 無符號數(shù)和正數(shù)的反碼是其本身,負數(shù)的反碼是將原碼除符號位外的其他位按位取反,即0變1,1變0。
補碼: 無符號數(shù)和正數(shù)的補碼是其本身,負數(shù)的補碼是反碼二進制加1
補碼的原理
在介紹補碼概念之前,先介紹一下"模"的概念:“?!笔侵敢粋€計量系統(tǒng)的計數(shù)范圍,如過去計量糧食用的斗、時鐘等。計算機也可以看成一個計量機器,因為計算機的字長是定長的,即存儲和處理的位數(shù)是有限的,因此它也有一個計量范圍,即都存在一個“模”。如:時鐘的計量范圍是0~11,模=12。表示n位的計算機計量范圍是,模=
?!澳!睂嵸|(zhì)上是計量器產(chǎn)生“溢出”的量,它的值在計量器上表示不出來,計量器上只能表示出模的余數(shù)。任何有模的計量器,均可化減法為加法運算。
假設(shè)當(dāng)前時針指向8點,而準確時間是6點,調(diào)整時間可有以下兩種撥法:一種是倒撥2小時,即8-2=6;另一種是順撥10小時,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12為模的系統(tǒng)里,加10和減2效果是一樣的,因此凡是減2運算,都可以用加10來代替。若用一般公式可表示為:a-b=a-b+mod=a+(mod-b)。對“?!倍?,2和10互為補數(shù)。實際上,以12為模的系統(tǒng)中,11和1,8和4,9和3,7和5,6和6都有這個特性,共同的特點是兩者相加等于模。對于計算機,其概念和方法完全一樣。n位計算機,設(shè)n=8,所能表示的最大數(shù)是11111111,若再加1成100000000(9位),但因只有8位,最高位1自然丟失(相當(dāng)于丟失一個模)。又回到了 00000000,所以8位二進制系統(tǒng)的模為。在這樣的系統(tǒng)中減法問題也可以化成加法問題,只需把減數(shù)用相應(yīng)的補數(shù)表示就可以了。把補數(shù)用到計算機對數(shù)的處理上,就是補碼。
三者之間的關(guān)系

操作符運算的優(yōu)先級
一元運算符具有最高優(yōu)先級。由于 ++ 和 -- 運算符形成語句,而不是表達式,因此它們不屬于運算符層次結(jié)構(gòu)。因此,語句 *p++ 與 (*p)++ 相同。
二元運算符有五個優(yōu)先級。乘法運算符最強,其次是加法運算符、比較運算符、&&(邏輯與),最后是 || (邏輯或)
| 優(yōu)先級 | 操作符 |
|---|---|
| 5 | * / % << >> & &^ |
| 4 | + - | ^ |
| 3 | == != < <= > >= |
| 2 | && |
| 1 | || |