1)理解個x進製的概念 :
每一位 只允許出現 0~x-1 這幾個數字,逢x進一,基是x, 每一位有乙個權值大小是x的冪次。 其表示的數值可以寫成按位權展開的多項式之和。
十進位制:
每一位只允許出現0~9這十個數字,逢十進1,基是十,每一位數字有乙個 權值大小是十的冪次。
其表示的數值可以寫成按位權展開的多項式之和。
二進位制:
每一位只允許出現0~1這二個數字,逢二進1,基是 二,
每一位數字有乙個權值大小是二的冪次。 其表示的數值可以寫成按位權展開的多項式之和。
還有八進位制和十六進製制
2)假如用兩個位元組表示 乙個整數,
如下:
十進位制數字1 的二進位制表現形式: 0000 0000 0000 0001
十進位制數字2 的二進位制表現形式: 0000 0000 0000 0010
如何表示二進位制數的正負?
3)有符號數和無符號數的概念
規則:把二進位制數中的最高位(最左邊的那位)用作符號位
對於有符號數,最高位被計算機系統規定為符號位(0為正,1為負)
對於無符號數,最高位被計算機系統規定為資料位
按照這種說法,比如有符號數 +2 -2 的原碼形式:
+2 = 0000 0000 0000 0010
-2 = 1000 0000 0000 0010
真值 機器數
+1 = 0000 0000 0000 0001
-1 = 1000 0000 0000 0001
-----------------------------------------
1000 0000 0000 0010
-1+1 的結果?
-1+1 = 1000 0000 0000 0010 ----》 -2
不等於0,按理說-1+1等於0才對,為什麼會是-2呢?
規則
數字在計算機中,是用二進位制補碼的形式來儲存的,因此-1 +1需要按照補碼進行相加才是正確的結果1)如何計算補碼?
規則:
正數:原碼 = 反碼 = 補碼
負數:反碼 = 符號位不變,其他位取反
補碼 = 反碼+1
1 的原碼:0000 0000 0000 0001
-1的原碼:1000 0000 0000 0001
-1的反碼:1111 1111 1111 1110
-1的補碼:1111 1111 1111 1111
重新計算 -1+1 結果
1111 1111 1111 1111
0000 0000 0000 0001
---------------------------
0000 0000 0000 0000
2)從補碼轉回原碼
負數補碼轉換原碼的規則:
原碼 = 補碼的符號位不變 -->資料位取反--> 尾+1
-1的補碼:1111 1111 1111 1111
取反:1000 0000 0000 0000
-1的原碼:1000 0000 0000 0001
可以把減法用加法來算,只需設計加法器就好了。運算的時候都是用補碼去運算的。
2-1 = 2+(-1)=0000 0000 0000 0010 +1111 1111 1111 1111
為何要使用原碼, 反碼和補碼
既然原碼才是被人腦直接識別並用於計算表示方式, 為何還會有反碼和補碼呢?
首先, 因為人腦可以知道第一位是符號位, 在計算的時候我們會根據符號位, 選擇對應加減,但是對於計算機,加減乘數已經是最基礎的運算, 要設計的盡量簡單。計算機辨別"符號位"顯然會讓計算機的基礎電路設計變得十分複雜!於是人們想出了將符號位也參與運算的方法.
我們知道,根據運算法則減去乙個正數等於加上乙個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了.於是人們開始探索 將符號位參與運算, 並且只保留加法的方法。
如果有乙個十進位制數 5,其二進位制為:通過以上2個例子,能夠看出,把乙個數的各位整體向左移動乙個位,就變成原來的2倍0000 0101
把所有的數向左移動一位 其結果為:
0000 1010
想一想:二進位制 0000 1010 十進位制是多少呢???其答案為10,有沒有發現是5的2倍呢!
再假設有乙個十進位制數 3, 其二進位制 為:
0000 0011
把所有的數向左移動一位 其結果為:
0000 0110
二進位制0000 0110 的十進位制為6,正好也是3的2倍
那麼在python中,怎樣實現向左移動呢?還有其他的嗎???
用途: 直接操作二進位制,省記憶體,效率高
1)<< 按位左移
各二進位全部左移n位,高位丟棄,低位補0
x << n 左移 x 的所有二進位制位向左移動n位,移出位刪掉,移進的位補零
【注意事項】
b.左移可能會改變乙個數的正負性
2)>> 右移
各二進位全部右移n位,保持符號位不變
x >> n x的所有二進位制位向右移動n位,移出的位刪掉,移進的位補符號位 右移不會改變乙個數的符號
【注意事項】
3)& 按位與
全1才1否則0 :只有對應的兩個二進位均為1時,結果位才為1,否則為0
4) | 按位或有1就1 只要對應的二個二進位有乙個為1時,結果位就為1,否則為0
5) ^ 按位異或不同為1 當對應的二進位相異(不相同)時,結果為1,否則為0
6) ~ 取反
~9 = -10
【為什麼9取反變成了-10的說明】:
9的原碼 ==> 0000 1001 因為正數的原碼=反碼=補碼,所以在 真正儲存的時候就是0000 1001
接下來進行對9的補碼進行取反操作
進行取反==> 1111 0110 這就是對9 進行了取反之後的補碼
既然已經知道了補碼,那麼接下來只要轉換為 咱們人能識別的碼型就可以,因此按照規則 ,把這個1111 0110 這個補碼 轉換為原碼即可
符號位不變,其它位取反==> 1000 1001
然後+1 ,得到原碼 *****==>1000 1010 這就是 -10
任何數和1進行&操作,得到這個數的最低位 數字&1 = 數字的二進位制形式的最低位
進製運算與位運算
不可以在二進位制表示形式中使用負號 5 0000 0101 5 1111 1011 取反加一 既是補碼 負數二進位制的計算方法是把整數二進位制按位求反 再加一 就是補碼 每個有符號資料型別中首位為 1 其它位都是 0 的二進位制表示這個資料型別的最小數 採用剛才的計算方法同樣可以根據負數的二進位制補...
go 數的進製與位運算
0,1 滿2進1 在golang中,不能直接使用二進位制來表示乙個整數,它沿用了c的特點 0 9滿10進1 0 7滿8進1 以數字0開頭表示 0 9 a f a f不區分大小寫 滿16進1 以0x或0x開頭表示 func main 執行結果 101 j 9 k 17func main 執行結果 a ...
php 位運算與許可權,PHP中的位運算和進製處理
php中的位運算和進製是比較冷門的知識,感覺很簡單也很好理解,但是在實際場景中卻很少使用,本篇博文就是簡單了解基本概念以及講解如何去實際使用.位運算php中的位運算子是對整形進行的操作,比如對於十進位制,二進位制,八進位制等數字的一些操作.按位與 and 按位或 or 按位取反 not 按位異或 x...