程式開發中二進位制常見問題

2021-12-30 03:35:39 字數 2179 閱讀 8003

程式開發中二進位制常見問題。理清字符集和字元編碼關係中介紹到計算機內部由積體電路決定了計算機的資訊只能用二進位制數處理。本期將介紹二進位制那些事。

移位運算指的是將二進位制數值的各數字進行左右移位的運算。左移空出來的低位要進行補0操作,右移空出來的高位要進行怎樣的操作,我們會在後面說明。

我們發現,左移兩位相當於對39乘以4,右移兩位相當於除4,也就是說計算機用移位演算法來表示資料的乘除運算

剛才之所有沒有介紹相關右移的內容,是因為用來填充右移後空出來的高位的數值,有 0 和 1 兩種形式。要想區分什麼時候補0什麼時候補1,只要掌握了用二進位制數表示負數的方法即可。

二進位制數中表示負數時,一般會把最高位作為符號來使用,也就是說,最高位是符號位。正數的符號位用0表示,負數的符號位用1表示。舉個栗子,1的二進位制數是0000 0001 ,那麼,-1的二進位制數是多少呢?難道是1000 0001,1000 0001+0000 0001 結果不是0,說明這個結果是錯的。為此,在表示負數時就需要使用補數補數就是用正數表示負數,通過將二進位制數的各位數值全部取反,然後再將結果加1得到補數。-1的補數是1111 1111。同理,1111 1110表示的負數是多少呢?這時我們可以利用負負得正這個性質。假設1111 1110是負xx,那麼1111 1110的補數是正xx。1111 1110的補數是0000 0010,因此1111 1110表示-2。

在介紹完補數後,讓我們返回到右移這個話題,右移之後在最高位有補0和補1兩種情況。當二進位制數的值表示圖形模式而非數值時,移位後在最高位補0,這是邏輯右移。將二進位制數值作為帶符號的數值進行運算時,移位後要在最高位填充前符號位的值( 0 或 1 ),這是算術右移

現在我們來看乙個右移的例子。將-8(1111 1000)右移兩位。這時,邏輯右移的情況下結果會是 0011 1110,也就是十進位制數62,顯然不是-2,而在算術右移的情況下,結果會變成1111 1110 ,用補數表示就是-2,和真實結果相同。需要注意的是只有在右移時才區分邏輯移位和算術移位。

通過上述介紹,我們對整數的二進位制表示方式做了說明。由於計算機內部所有資訊都是以二進位制數的形式來處理,因此在這一點上,整數和小數並無差別。不過,使用二進位制數表示整數和小數的方法卻有很大的不同。

由於二進位制數表示的小數的數值範圍是有限的,並不能表示所有的十進位制小數。例如:小數點後3位用二進位制數表示時的數值範圍為0.000~0.111,但是只能表示有限的十進位制小數,如下圖所示。

為了加深大家印象,舉乙個更加實際的栗子:將0.1累加100次最終結果是10.000002,不是10。

public class testbinary

system.out.println(sum);}}

現在,我們應該知道僅僅依靠紙面上的二進位制數是表示不了全部小數。那麼,計算機實際上是以什麼樣的表現形式來處理小數的呢?

目前,計算機提供了單精度浮點數和雙精度浮點數來表示小數形式。單精度浮點數用32位表示全體小數,而雙精度浮點數用64位表示。它們都是由符號、尾數和指數組成。

接下來,讓我們一起看一下如果將0.1用單精度浮點數來表示,累加100次的結果是否是10,可以結果又一次出乎意料,結果是10.000002。

public static void main(string args)

system.out.println(sum);}}

我們知道,無論是用紙面二進位制還是浮點數表示小數,都存在計算出錯的可能性,那麼我們該如何避免這種問題呢?

首先是迴避策略,即無視這些問題。有時候一些微小的偏差並不會造成什麼問題。其次,把小數轉換成整數來計算。還是以0.1累加100次為例,將0.1擴大10倍後累加100次,最後把結果除以10就可以了。

public class testbinary

system.out.println(sum/10);}}

PB中二進位制檔案讀取問題 原創

筆者在開發乙個應用系統時需要處理dbf檔案資料,在pb中僅能夠支援dbaseii,dbaseiii的資料格式,對於更新版本不被支援。因此需要自己程式設計進行處理。在程式設計過程中碰到二進位制檔案讀寫操作方面的問題,例如 按位元組讀入以下格式的檔案並轉換成十進位制字元 aa 00 56 00 bb b...

二進位制問題

題目 題解 純二進位制題目。因為所有的水都是由兩份相同的水合併而成的,因此每瓶水的體積一定是2 i,i in n 2 i i n 公升。最後保留k個瓶子,那麼最後總的公升數的二進位制表示中,1的個數一定 k。本題實質上是用不超過k個1和無數個0生成乙個最接近且大於n的二進位制數 方法一 includ...

二進位制 二進位制起源

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