二進位制數 位和位元組

2021-06-19 19:33:13 字數 3054 閱讀 8872

書寫數字的常用方法是十進位制。例如:2157的千位是2,百位是1,十位是5,個位是7,這意味著可以將2157看作如下形式:

2×1000+ 1×100 + 5×10 + 7×1

也就是如下形式:

2×103+1×102+ 5×101+7×100

姑且認為,十進位制得以發展的原因是我們都有10根手指。在某種意義上說,計算機的位只有2根手指,原因是它只能被設為0或1。因此,以2為基數的系統適用於計算機。它用2的冪代替10的冪。以2為基數表示的數字稱為二進位制數。數字2對於二進位制數的作用和數字10對於十進位制數的作用是相同的。例如,二進位制數1101可表示為一下形式:

1×23+ 1×22 + 0×21+ 1×20

以十進位制數形式表示為:

1×8+ 1×4 + 0×2 + 1×1 = 13

可以使用二進位制系統將任何整數表示為1和0的組合。這種系統非常適於數字計算機使用,數字計算機使用開啟和關閉狀態的組合來表示資訊,而這些狀態可以使用1和0表示。

乙個位元組通常包括8個位。我們可以將這8位從左到右看作是從7到0。在位元組中,位7稱為高位,為0稱為低位。每位數字是對應2的乙個特定的指數。可將位元組設想成如下圖的形式

這裡128是2的7次冪,依此類推。該位元組可以儲存的最大數是把所有的位都設定為1:11111111。該二進位制數的值如下:

128 + 64 +32 + 16 + 8 + 4 + 2 + 1 = 255

最小的二進位制數是 00000000,或乙個簡單的0。乙個位元組可以儲存的範圍是0到255,總共256個可能的值。通過改變對位模式的解釋方式,乙個位元組可以儲存從-128到+127之間的整數,總共還是256個值。

有符號數的表示方法是由硬體決定,而不是c決定的。或許表示有符號數最簡單的方法就是保留1位符號位。在乙個1位元組值中,該方法為數字本身留下7位。使用這樣的符號量表示法,10000001表示-1,00000001表示1。那麼整個範圍是-127到+127。這就是原碼,原碼是人腦最容易理解和記憶的方式。

這種方法的乙個缺點是有兩個零:+0和-0。二進位制補碼避免了這種問題,這是當今使用最普遍的系統。不過在介紹補碼之前,需要先介紹二進位制反碼。

反碼的表示方法是:正數的反碼是其原碼本身,負數的反碼是在其原碼基礎上,符號位不變,其餘各位取反。因此,00000001(+1)的反碼為:00000001,10000001(-1)的反碼為:11111110。在此基礎之上,正數的補碼仍然為其原碼本身,負數的補碼再在其反碼基礎上加1。因此,10000001(-1)的補碼即為:11111111。

補碼如何解決兩個零的問題呢?以十進位制數1 - 1 = 0為例,如果用原碼表示,讓符號位也參與計算,如下:

1 – 1 = 1 +(-1) = 00000001 + 10000001 = 10000010 = -2

這個結果顯然是不正確的。為了解決這個問題,我們引入了反碼:

1 – 1 = 1 +(-1) = 00000001 + 10000001 = 00000001 + 11111110 = 11111111 = 10000000 = -0

發現結果的真值部分是正確的,而符合位存在問題,雖然人們理解上+0和-0是一樣的,但是0帶符號是沒有意義的。因此,補碼的出現就是解決這個問題:

1 – 1 = 1 +(-1) = 00000001 + 10000001 = 00000001 + 11111111 = 100000000

結果為9位,去掉最高位,結果為00000000 = 0。這樣0用00000000表示,可以用10000000表示-128。

由於任何單位元組數的補碼和它相反數的補碼相加,結果都為100000000。因此,從這個9位組合100000000(256的二進位制形式)中減去乙個負數的位組合,結果一定是該負數值的數量。例如乙個負數的位組合為10000000。作為乙個無符號數,該組合為128。作為乙個有符號數,該組合為負,並且值為100000000 - 10000000,即10000000(128)。因此,該數為-128。與之類似,10000001是-127,11111111是-1。

要對乙個二進位制補碼數取相反數,最簡單的方法是反轉每一位,然後加1。因為1是00000001,所以-1是11111110 + 1,即11111111,和前面所看到的是一致的。

浮點數分兩部分儲存:乙個二進位制小數和乙個二進位制指數。普通的小數0.527代表:

5 ÷10+ 2 ÷100 + 7÷1000

其中的分母是10的依次遞增的冪。在二進位制小數中,使用2的冪作為分母,因此二進位制小數 .101 代表:

1÷2+ 0÷4 + 1÷8 = 0.50 + 0.00 +0.125 = 0.625

像1/3這樣的許多小數不能用十進位制計算法精確地表示。同樣,許多小數也不能用二進位制計數法精確地表示。實際上,二進位制計數法只能精確地表示多個1/2的冪的和。因此3/4和7/8可以精確表示為二進位制小數,但是1/3和2/5卻不能。

要在計算機中表示乙個浮點數,需要留出若干位(其位數取決於系統)存放乙個二進位制小數,其他位存放乙個指數。總之,數字的實際值是二進位制小數部分乘以2的指定次冪。比如用4乘以乙個浮點數,則指數增加了2,二進位制小數不改變。用乙個不是2的冪的數乘以乙個浮點數,則會改變二進位制小數,如果有必要也會改變指數部分。

本文參考了c primer plus, fifth editon chapter 15. bit fiddling

藍橋杯 二進位制數數(位運算)

問題描述 給定l,r。統計 l,r 區間內的所有數在二進位制下包含的 1 的個數之和。如5的二進位制為101,包含2個 1 輸入格式 第一行包含2個數l,r 輸出格式 乙個數s,表示 l,r 區間內的所有數在二進位制下包含的 1 的個數之和。樣例輸入 2 3樣例輸出 3 bit intcnt one...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

二進位制中1的個數 (位運算)

題目描述 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。知識點 1.左移運算子 1 格式 value num num 指定要移動的位數。2 運算規則 按二進位制形式把所有的數字向左移動對應的位數,高位移出 捨棄 低位的空位補零。如果移動的位數超過了該型別的最大位數,那麼編譯器會對...