(十二)golang--進制和位運算


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM