進位轉換以及位運算
本文程式碼演示採用的是
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
其它進位轉十進位
- 十進位數字計算
$123 = 3 * 1 + 2 * 10 + 1 * 100$
- 二進位轉十進位
從最低位開始,將每個位上的數提取出來,乘以2的位數-1次方,然後求和
$1011 = 1 * 1 + 1 * 2 + 0 * 4 + 1 * 8 = 1 + 2 + 0 + 8 = 11$
- 八進位轉十進位 同理
$0123 = 3 * 1 + 2 * 8 + 1 * 64 = 3 + 16 + 64 = 83$
- 十六進位轉十進位 同理
$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;// 異或運算具有交換律
又:aaa = 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
熱愛前端開發,也喜歡專研各種跟本職工作關係不大的技術,技術、產品興趣廣泛且濃厚。本號主要致力於分享個人經驗總結,希望可以給一小部分人一些微小幫助。
希望能和大家一起努力營造一個良好的學習氛圍,為了個人和家庭、為了中國的互聯網物聯網技術、數字化轉型、數字經濟發展做一點點貢獻。數風流人物還看中國、看今朝、看你我。