博客 / 詳情

返回

進制轉換以及位運算

本文代碼演示採用的是golang語言

進制

// 二進制
// go不能直接輸出二進制,可以使用 %b 格式化
// fmt %b    表示為二進制
var n int = 5
fmt.Printf("%T %b\n", n, n) // 101

// 8進制, 0-7
// 以數字0開頭表示
var n1 int = 011
fmt.Printf("%T %v\n", n1, n1) // 9

// 16進制,0-9A-F,
// 以0x或者0X開頭表示
var n2 int = 0x11
fmt.Printf("%T %v\n", n2, n2) // 17

其它進制轉十進制

  1. 十進制數字計算

$123 = 3 * 1 + 2 * 10 + 1 * 100$

  1. 二進制轉十進制

從最低位開始,將每個位上的數提取出來,乘以2的位數-1次方,然後求和

$1011 = 1 * 1 + 1 * 2 + 0 * 4 + 1 * 8 = 1 + 2 + 0 + 8 = 11$

  1. 八進制轉十進制 同理

$0123 = 3 * 1 + 2 * 8 + 1 * 64 = 3 + 16 + 64 = 83$

  1. 十六進制轉十進制 同理

$0x34A = 10 * 1 + 4 * 16 + 3 * 16 * 16 = 842$

十進制轉其它進制

除K取餘法,K就是要轉換成的多少進制

十進制轉二進制

規則: 將該數不斷除以2,知道商為0為止,然後將每步得到的餘數倒過來,就是對應的二進制

二進制轉八進制

規則: 將二進制數每三位一組(從低位開始組合),轉成對應的八進制數即可。

二進制的三位最多表示0-7

二進制: 11010101

八進制: 0325

二進制轉十六進制

規則: 將二進制數每四位一組(從低位開始組合),轉成對應的十六進制即可。

二進制的三位最多表示0-15

二進制: 11010101

十六進制: 0XD5

八進制轉二進制

規則: 將八進制數每一位,轉成對應的一個三位的二進制數即可

八進制:0237

二進制:10011111

十六進制轉二進制

規則: 將十六進制數每一位,轉成對應的一個四位的二進制數即可

十六進制:0237

二進制:1000110111

接下來講解原碼補碼反碼以及位運算

原碼反碼補碼(二進制)

原碼:最高位是符號位,其它位取絕對值即可

反碼:

  • 正數:反碼和原碼相同
  • 負數:符號位一定是1,其餘位對原碼取反。

補碼:

  • 正數:補碼和原碼相同
  • 負數:符號位一定是1,反碼 + 1。

0的反碼補碼都是0

計算機運算的時候,都是以補碼的方式來運算的

位運算

與運算(and 、&)

兩個都為1,結果位1

2 & 3
2的補碼: 0000 0010
3的補碼: 0000 0011
--------------------- 2 & 3
2 & 3   = 0000 0010 = 2

或運算(or、 |)

只要有一個為1,結果為1

2 | 3
2的補碼: 0000 0010
3的補碼: 0000 0011
--------------------- 2 | 3
2 | 3   = 0000 0011 = 3

異或運算(XOR 或 EOR、^)

不相同就是1

XOR它指的是邏輯運算中的“異或運算”。兩個值相同時,返回false,否則返回 true,用來判斷兩個值是否不同。

JavaScript語言的二進制運算,有一個專門的 XOR 運算符,寫作^
關於異或運算有下面幾個規律

1^1=0;
1^0=1;
0^1=1;
0^0=0;

也就説0和1異或的時候相同的異或結果為0,不同的異或結果為1,根據上面的規律我們得到如下結論

a^a=0;      // 自己和自己異或等於0
a^0=a;      // 任何數字和0異或還等於他自己
a^b^c=a^c^b;// 異或運算具有交換律

又:a^a^a = a

XOR 運算有一個特性:如果對一個值連續做兩次 XOR,會返回這個值本身。這也是其可以用於信息加密的根本。

2 ^ 3
2的補碼: 0000 0010
3的補碼: 0000 0011
--------------------- 2 ^ 3
2 ^ 3   = 0000 0001 = 1

負數的異或運算

-2 ^ 2
-2的原碼: 0000 0010
-2的反碼: 1111 1101
-2的補碼: 1111 1110
2的補碼:  0000 0010
--------------------- 2 ^ 3
-2 ^ 2   =  1111 1100  ====> 補碼,需要再轉成原碼
先換成反碼=補碼-1=1111 1011
原碼=1000 0100 = -4
最終結果-2 ^ 2 = -4
fmt.Printf("2&3=%v\n", 2&3)   // 2
fmt.Printf("2|3=%v\n", 2|3)   // 3
fmt.Printf("2^3=%v\n", 2^3)   // 1
fmt.Printf("-2^2=%v\n", -2^2) // -4

移位運算

0000 0001    1
0000 0010    2
0000 0100    4
0000 1000    8

# 對於10進制來説,左移就是*2,右移就是/2

# 左移  shl << 
# 所有二進制位全部左移,高位丟棄,低位補0

# 右移  shr >>
# 所有二進制位全部右移,低位丟棄,高位補0,1(根據符號位決定)
a := 1 >> 2
b := 1 << 2
fmt.Printf("1 >> 2 = %v \n", a) // 0
fmt.Printf("1 << 2 = %v \n", b) // 4

計算機中的加法:

運算流程圖展示如下:

計算機中只有加法運算,其它的運算也是通過加法實現的,只需要理解掌握加法運算就可以了。


我是 甜點cc

熱愛前端開發,也喜歡專研各種跟本職工作關係不大的技術,技術、產品興趣廣泛且濃厚。本號主要致力於分享個人經驗總結,希望可以給一小部分人一些微小幫助。

希望能和大家一起努力營造一個良好的學習氛圍,為了個人和家庭、為了我國的互聯網物聯網技術、數字化轉型、數字經濟發展做一點點貢獻。數風流人物還看中國、看今朝、看你我。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.