進製與位運算

2021-08-20 10:45:58 字數 3343 閱讀 2084

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,其二進位制為:0000 0101

把所有的數向左移動一位 其結果為:0000 1010

想一想:二進位制 0000 1010 十進位制是多少呢???其答案為10,有沒有發現是5的2倍呢!

再假設有乙個十進位制數 3, 其二進位制 為:0000 0011

把所有的數向左移動一位 其結果為:0000 0110

二進位制0000 0110 的十進位制為6,正好也是3的2倍

通過以上2個例子,能夠看出,把乙個數的各位整體向左移動乙個位,就變成原來的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...