本文代碼演示采用的是
golang
語言
進(jìn)制
// 二進(jìn)制
// go不能直接輸出二進(jìn)制编振,可以使用 %b 格式化
// fmt %b 表示為二進(jìn)制
var n int = 5
fmt.Printf("%T %b\n", n, n) // 101
// 8進(jìn)制, 0-7
// 以數(shù)字0開頭表示
var n1 int = 011
fmt.Printf("%T %v\n", n1, n1) // 9
// 16進(jìn)制嚼酝,0-9A-F,
// 以0x或者0X開頭表示
var n2 int = 0x11
fmt.Printf("%T %v\n", n2, n2) // 17
其它進(jìn)制轉(zhuǎn)十進(jìn)制
- 十進(jìn)制數(shù)字計(jì)算
- 二進(jìn)制轉(zhuǎn)十進(jìn)制
從最低位開始枣申,將每個(gè)位上的數(shù)提取出來还棱,乘以2的位數(shù)-1次方撤摸,然后求和
- 八進(jìn)制轉(zhuǎn)十進(jìn)制 同理
- 十六進(jìn)制轉(zhuǎn)十進(jìn)制 同理
十進(jìn)制轉(zhuǎn)其它進(jìn)制
除K取余法温眉,K就是要轉(zhuǎn)換成的多少進(jìn)制
十進(jìn)制轉(zhuǎn)二進(jìn)制
規(guī)則: 將該數(shù)不斷除以2缸匪,知道商為0為止,然后將每步得到的余數(shù)倒過來类溢,就是對(duì)應(yīng)的二進(jìn)制
二進(jìn)制轉(zhuǎn)八進(jìn)制
規(guī)則: 將二進(jìn)制數(shù)每三位一組(從低位開始組合)凌蔬,轉(zhuǎn)成對(duì)應(yīng)的八進(jìn)制數(shù)即可。
二進(jìn)制的三位最多表示0-7
二進(jìn)制: 11010101
八進(jìn)制: 0325
二進(jìn)制轉(zhuǎn)十六進(jìn)制
規(guī)則: 將二進(jìn)制數(shù)每四位一組(從低位開始組合)闯冷,轉(zhuǎn)成對(duì)應(yīng)的十六進(jìn)制即可砂心。
二進(jìn)制的三位最多表示0-15
二進(jìn)制: 11010101
十六進(jìn)制: 0XD5
八進(jìn)制轉(zhuǎn)二進(jìn)制
規(guī)則: 將八進(jìn)制數(shù)每一位,轉(zhuǎn)成對(duì)應(yīng)的一個(gè)三位的二進(jìn)制數(shù)即可
八進(jìn)制:0237
二進(jìn)制:10011111
十六進(jìn)制轉(zhuǎn)二進(jìn)制
規(guī)則: 將十六進(jìn)制數(shù)每一位蛇耀,轉(zhuǎn)成對(duì)應(yīng)的一個(gè)四位的二進(jìn)制數(shù)即可
十六進(jìn)制:0237
二進(jìn)制:1000110111
接下來講解原碼補(bǔ)碼反碼以及位運(yùn)算
原碼反碼補(bǔ)碼(二進(jìn)制)
原碼:最高位是符號(hào)位辩诞,其它位取絕對(duì)值即可
反碼:
- 正數(shù):反碼和原碼相同
- 負(fù)數(shù):符號(hào)位一定是1,其余位對(duì)原碼取反纺涤。
補(bǔ)碼:
- 正數(shù):補(bǔ)碼和原碼相同
- 負(fù)數(shù):符號(hào)位一定是1译暂,反碼 + 1。
0的反碼補(bǔ)碼都是0
計(jì)算機(jī)運(yùn)算的時(shí)候撩炊,都是以補(bǔ)碼的方式來運(yùn)算的
位運(yùn)算
與運(yùn)算(and 外永、&)
兩個(gè)都為1,結(jié)果位1
2 & 3
2的補(bǔ)碼: 0000 0010
3的補(bǔ)碼: 0000 0011
--------------------- 2 & 3
2 & 3 = 0000 0010 = 2
或運(yùn)算(or拧咳、 |)
只要有一個(gè)為1伯顶,結(jié)果為1
2 | 3
2的補(bǔ)碼: 0000 0010
3的補(bǔ)碼: 0000 0011
--------------------- 2 | 3
2 | 3 = 0000 0011 = 3
異或運(yùn)算(XOR 或 EOR、^)
不相同就是1
XOR它指的是邏輯運(yùn)算中的“異或運(yùn)算”。兩個(gè)值相同時(shí)砾淌,返回false啦撮,否則返回 true,用來判斷兩個(gè)值是否不同汪厨。
JavaScript
語言的二進(jìn)制運(yùn)算赃春,有一個(gè)專門的 XOR 運(yùn)算符,寫作^
劫乱。
關(guān)于異或運(yùn)算有下面幾個(gè)規(guī)律
1^1=0;
1^0=1;
0^1=1;
0^0=0;
也就說0和1異或的時(shí)候相同的異或結(jié)果為0织中,不同的異或結(jié)果為1,根據(jù)上面的規(guī)律我們得到如下結(jié)論
a^a=0衷戈; // 自己和自己異或等于0
a^0=a狭吼; // 任何數(shù)字和0異或還等于他自己
a^b^c=a^c^b;// 異或運(yùn)算具有交換律
又:aaa = a
XOR 運(yùn)算有一個(gè)特性:如果對(duì)一個(gè)值連續(xù)做兩次 XOR殖妇,會(huì)返回這個(gè)值本身刁笙。這也是其可以用于信息加密的根本。
2 ^ 3
2的補(bǔ)碼: 0000 0010
3的補(bǔ)碼: 0000 0011
--------------------- 2 ^ 3
2 ^ 3 = 0000 0001 = 1
負(fù)數(shù)的異或運(yùn)算
-2 ^ 2
-2的原碼: 0000 0010
-2的反碼: 1111 1101
-2的補(bǔ)碼: 1111 1110
2的補(bǔ)碼: 0000 0010
--------------------- 2 ^ 3
-2 ^ 2 = 1111 1100 ====> 補(bǔ)碼谦趣,需要再轉(zhuǎn)成原碼
先換成反碼=補(bǔ)碼-1=1111 1011
原碼=1000 0100 = -4
最終結(jié)果-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
移位運(yùn)算
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
# 對(duì)于10進(jìn)制來說疲吸,左移就是*2,右移就是/2
# 左移 shl <<
# 所有二進(jìn)制位全部左移前鹅,高位丟棄摘悴,低位補(bǔ)0
# 右移 shr >>
# 所有二進(jìn)制位全部右移,低位丟棄舰绘,高位補(bǔ)0蹂喻,1(根據(jù)符號(hào)位決定)
a := 1 >> 2
b := 1 << 2
fmt.Printf("1 >> 2 = %v \n", a) // 0
fmt.Printf("1 << 2 = %v \n", b) // 4
計(jì)算機(jī)中的加法:
運(yùn)算流程圖展示如下:
計(jì)算機(jī)中只有加法運(yùn)算,其它的運(yùn)算也是通過加法實(shí)現(xiàn)的捂寿,只需要理解掌握加法運(yùn)算就可以了口四。
我是 甜點(diǎn)cc
熱愛前端開發(fā),也喜歡專研各種跟本職工作關(guān)系不大的技術(shù)者蠕,技術(shù)窃祝、產(chǎn)品興趣廣泛且濃厚。本號(hào)主要致力于分享個(gè)人經(jīng)驗(yàn)總結(jié)踱侣,希望可以給一小部分人一些微小幫助粪小。
希望能和大家一起努力營造一個(gè)良好的學(xué)習(xí)氛圍,為了個(gè)人和家庭抡句、為了我國的互聯(lián)網(wǎng)物聯(lián)網(wǎng)技術(shù)探膊、數(shù)字化轉(zhuǎn)型、數(shù)字經(jīng)濟(jì)發(fā)展做一點(diǎn)點(diǎn)貢獻(xiàn)待榔。數(shù)風(fēng)流人物還看中國逞壁、看今朝流济、看你我。