day4-進制與位運算

進制

對於整數有4種表現方式

  • 二進制,滿二進一
  • 十進制,滿10進1
  • 八進制,滿8進1,數字0開頭
  • 十六進制,滿16進1,以0x或0X開頭

進制轉換

二進制轉十進制

規則:從最低位開始(右邊),將每位數提取出來,乘以2的(位數-1)次方,然後求和
1011 = 2^0 + 2^1 + 0 + 2^3 = 11
110001100 = 4 + 8 + 2^7 + 2^8  = 128 +256 +4 +8 =396

二進制轉八進制

規則:將二進制的每三位一組(從最右邊),轉成對應的八進制數即可
11010101 = (11)(010)(101) = 0325
11100101 = (11)(100)(101) = 0345

二進制轉十六進制

規則:將二進制的每四位一組(從最右邊),轉成對應的十六進制數即可
11010101 = (1101)(0101) = 0xd5
1110010110 = (11)(1001)(0110) = 0x396

八進制轉十進制

規則:從最低位開始(右邊),將每位數提取出來,乘以8的(位數-1)次方,然後求和
0123 = 3 * 8^0 + 2 * 8^1  + 1* 8^2 = 3+16+64 = 83
02456 = 6 + 40 + 64*4 +2*8^3 = 1024 + 256 + 46 = 1326

八進制轉二進制

規則:將八進制的每一位數轉化成對應3位數的二進制即可
0237 = (010)(011)(111)

十六進制轉十進制

規則:從最低位開始(右邊),將每位數提取出來,乘以16的(位數-1)次方,然後求和
0X34A = 10 * 16^0 + 4 * 16^1 + 3 * 16^2 = 10 + 64 + 768 = 842
0xA45 = 5 + 64 + 10 * 16^2 = 2560+ 69 = 2629

十六進制轉二進制

規則:將十六進制的每一位數轉化成對應4位數的二進制即可
0x237 = (0010)(0011)(0111)

十進制轉二進制

規則:將該數不斷除以2,直到商爲0爲止,將每部對應的餘數倒過來就是對應二進制
56 = 111000
123 = 1111011

image

十進制轉八進制

規則:將該數不斷除以8,直到商爲0爲止,將每部對應的餘數倒過來就是對應二進制
156 = 0234
678 = 1246

image

十進制轉十六進制

規則:將該數不斷除以16,直到商爲0爲止,將每部對應的餘數倒過來就是對應二進制
356 =  0x164
8912 = 0X22d0

image

位運算

二進制的運算

在計算機內部,運行各種計算時,都是以二進制的方式運行

原碼、反碼、補碼

  1. 對於有符號的而言,二進制的最高位是符號爲,0爲整數,1爲負數
  2. 正數的原碼、反碼、補碼都一樣
  3. 負數的反碼,符號位不變,其他位取反
  4. 負數的補碼,等於反碼+1
  5. 0的反碼補碼都是0
  6. 計算機運行的時候,都是以補碼的方式運行的
1  -》 原碼0000 0001 =》反碼=》0000 0001=》補碼0000 0001
-1 =》 源碼1000 0001 =》反碼=》1111 1110=》補碼1111 1111

image

位運算符和移位運算符

3個位運算
  1. 按位與& : 2位爲1,結果爲1,反之爲0
  2. 按位或| : 2位其中一位爲1,結果爲1,反之爲0
  3. 按位異或^ : 兩個相同爲0,不同爲1
2個移位運算符
  1. 左移<< 符號位不變,低位補0
  2. 右移>>符號位不變,低位溢出,並用符號爲補溢出的高位
a := 1 >> 2 // 0000 0001 => 0000 0000 = 0
b := 1 << 2 // 0000 0001 => 0000 0100 = 4

思考題

1) 請看下面的代碼段,回答 a,b,c,d 結果是多少?
func main() { 
    var a int = 1 >> 2 
    var b int = -1 >> 2
    var c int = 1 << 2 
    var d int = -1 << 2 
    
    //a,b,c,d 結果是多少 
    fmt.Println("a=", a)  //0
    fmt.Println("b=", b)  //-1
    fmt.Println("c=", c)  //4
    fmt.Println("d=", d)  //-4
}

1 >> 2 // 0000 0001 => 0000 0000 = 0
-1 >> 2 // 1000 0001原碼 =》反碼 1111 1110=》補碼 1111 1111 >>2 = 1111 1111 補碼=》反碼1111 1110 =》 1000 0001 = -1
1 << 2 // 0000 0001 => 0000 0100 = 4
-1 << 2  // 1111 1111補碼=》1111 1100 =》反碼=》1111 1011 =》原碼 1000 0100 = -4

2) 請回答在 Golang 中,下面的表達式運算的結果是: 
func main() { 
    fmt.Println(2&3) //2
    fmt.Println(2|3) //3
    fmt.Println(13&7) //5
    fmt.Println(5|4) //5
    fmt.Println(-3^3) //-2 
}

2&3 0000 0010
    0000 0011 
    0000 0010 = 2

2|3 0000 0010
    0000 0011
    0000 0011 = 3
    
13&7 0000 1101
     0000 0111
     0000 0101 =5

5|4 0000 0101
    0000 0100
    0000 0101 = 5

-3^3 1111 1101
     0000 0011
     1111 1110補碼 =》1111 1101反碼 =》 1000 0010 = -2 
-3 =》 1000 0011原碼=》反碼 1111 1100 =》補碼1111 1101
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章