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

Tags: