golang的位運算

常見的golang位運算符:

&    位與(bitwise AND)            
|    位或 (bitwise OR)             
^    位異或 (bitwise XOR)            
&^   位清空 (AND NOT)

>>   左移       integer >> unsigned integer
<<   右移       integer << unsigned integer
go 位操作符

&, |, <<>> 都是常見的運算符,主要說明 ^, &^的使用進行說明

  • ^ 作為一元運算符時表示位反或位補

當(dāng)作為一元運算符的時候,進行運算時,對其補充一個操作數(shù) m; 如 ^n等價于m ^ n, 然后進行二元計算; 其中mn 同類型, 并且規(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位的計算機計量范圍是0 ~ 2^n-1,模=2^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)的模為2^8。在這樣的系統(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 ||

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容