(十二)golang--進位和位運算
- 2019 年 11 月 11 日
- 筆記
1.基本進位
(1)二進位:0,1,滿2進1
- 在golang中,不能直接使用一個二進位表示一個整數,可以用八進位、十進位和十六進位表示
(2)十進位:0-9,滿10進1
(3)八進位:0-7,滿8進1,以數字0開頭
(4)十六進位:0-9及A-F,滿16進1,以0x或0X開頭,此處A-F不區分大小寫,例如0x21AF+1=0x21B0
package main import "fmt" func main() { var i int = 5 fmt.Printf("%b n", i) //這裡^表示幾次方 //轉成十進位為:8^1+8^0=9 var j int = 011 fmt.Println("j=", j) //轉成十進位:16^1+16^0=17 var k int = 0x11 fmt.Println("k=", k) }

2.進位之間的轉換
(1)其它進位轉十進位
次方相加
比如:二進位1011轉為十進位:2^3+2^1+2^0=11
八進位23轉為十進位:2*(8^1)+3*(8^0)=16+3=19
(2)十進位轉其他進位
除法取余
11轉二進位:11除以2,商為5,餘數為1;5除以2,商為2,餘數為1;2除以2,商為1,餘數為0;1除以2,商為0,餘數為1,;當商為零時,餘數從後往前排列:1011
(3)二進位轉八進位、十六進位
二進位-->八進位:從右往左,每三位轉成八進位;111101的八進位就是75:7=1*2^2+1*2^1+1*2^0,5=1*2^2+1*2^0
二進位-->十八進位:從右往左,每四位轉成十六進位;11111011的十六進位就是FB
(4)八進位、十六進位轉二進位
八進位-->二進位:依次將每一位轉為3位的二進位
十六進位-->二進位:依次將每一位轉成4位的二進位
3.位運算
(1)原碼、反碼、補碼
1)對於有符號而言:
- 二進位的最高位是符號位:0表示正數,1表示負數
- 正數的原碼、反碼、補碼都一樣
- 負數的反碼=除符號位以外的取反
- 負數的補碼=反碼+1
- 0的反碼、補碼都是0
- 在電腦運算的時候,都是以補碼的方式進行運算的
按位&:兩位全為1,則為1,否則為0
按位|:兩位中有一個為1,則為1,否則為0
按位^:兩位一個為1,一個為0,結果為1,否則為0
例如:2的原碼、反碼和補碼都是:0000 0010
3的原碼、反碼和補碼都是:0000 0011
則有 2 & 3 = 0000 0010 = 2
2 | 3 = 0000 0011 = 3
2 ^ 3 = 0000 0001 = 1
再看-2的原碼:1 000 0010,其反碼為1 111 1101,補碼為1 111 1110
則有-2^2 =1 111 1110 ^ 0 000 0010 = 1 111 1100,我們必須轉換成原碼才能知道它的值,則有:結果-1再取反
1 111 1100 - 1 = 1 111 1011 符號位不變再取反 1 000 0100,則-2^2的值是:-4
1 111 1100 - 1 = 1 111 1011 再取法
(2)>>和<<
>>:符號位不變,低位溢出,高位補0,例如補碼1100 0011 變成 1010 0001;對於正數而言,相當於值除以2,負數沒實際意義;
<<:符號位不變,低位補0,例如補碼1100 0011 變成 100 00110;對於正數而言,相當於值乘以2,負數沒實際意義;

