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,負數沒實際意義;