C 二進位制小數以及對異域的理解

2022-07-13 10:27:08 字數 2684 閱讀 1138

注:我們預設1個位元組用8個位 ,編號分別為7~1。

實際上,二進位制表示法只能精確地表示多個1/2的冪的和,如3/4, 7/8,而1/3, 2/5等是無法精確表示的。

粗暴理解就是男性和女性能生出孩子,否則就不行。不允許共存。

異或運算其實就是半加器運算,不進製

0 xor 0 =0

0 xor 1 =1

1 xor 1 =(1) 0

1 xor 0 =1

異或實際上就是判斷兩個輸入邏輯值是否不同,如果不同則結果為1,相同則為0。若a=0,b=0,a異或b 兩數相同,輸出結果為0,結果與b相同;

若a=0,b=1,a異或b 兩數不同,輸出結果為1,結果與b相同;

若a=1,b=0,a異或b 兩數不同,輸出結果為1,結果與b相反;

若a=1,b=1,a異或b 兩數相同,輸出結果為0,結果與b相反;

按位運算子常用於掩碼(mask),所謂掩碼指的是一些設定為開(1)或關(0)的位組合。

為什麼叫其為掩碼呢?

我們把乙個量與掩碼結合後發生什麼情況:

例如:假設定義符號常量mas為2(即,二進位制形式為00000010),只有1號位是1,其他位都是0

flag =10010110b

flags = flags & mark;

把flags中除1號位以外的所有位都設定為0,因為使用按位與運算子(&)任何位與0組合都得0,1號位的值不變,(如果1號位是1,那麼1&1得1;如果1號位是0,那麼0&1=0),這個過程叫使用掩碼,因為掩碼中的0隱藏了flags中相應的位。

可以這樣模擬,把掩碼中的0看做不透明,1看做透明,表示式flags&mask相當於用掩碼覆蓋在flags的位組合上,只有mask為1的位才可見。

有時,需要開啟乙個值中的特定位,同時保持其他位不變。

例如一台ibm pc 通過向埠傳送值來控制硬體,例如,為了開啟內建揚聲器,必須開啟一號位,同時保持其他位不變,這種情況可以使用按位或運算子(|)。

flag=00001111b

mark=10110110b

flags |=mark;

這樣,(00001111)|(10110110)=(10111111)

mark中為1的位,flags與其對應的位也為1,mark中為0的位,flag與其對應的位不變。

這種方法根據mark中為1的位,把flags中對應的位設定位1,其他位不變。

和開啟特定的位類似,有時需要在不影響其他位的情況下關閉指定的位,假設要關閉flag中的0號位,同樣,mark只有1號位為1(即,開啟):

flags =flags &~mark;

有mark 除1號位為1以外,其他位全為0,所以~mark除1號位為0以外,其他位全為1,使用&,任何位與1組合都得本身,所以這條語句保持1號位不變,改變其他各個位,另外,使用&,任何位與0組合都得0,所以無論1號位的初始值是什麼,都將其設定為0;

例如:假設flags是00001111,mark是10110110,下面的表示式:

flags & ~mark

(00001111)&~(10110110)

其結果為00001001,

mask中為1的位在結果中都被設定(清空)為0,flags中與mark為0的位相應的位在結果中都未改變。

可以使用以下的簡化形式:

flags &=~mark;

切換位指的是開啟已關閉的位,或關閉已開啟的位,可以使用按位異或運算子(^)切換位。

flags =flags ^mask;

flags ^=mask;

例如,假設flags是00001111,mask是10110110,

flags ~mask

(00001111)^(10110110);

其結果為:

(10111001)

flags中與mas為1的位相對應的位都被切換了,mask為0的位相對應的位不變。

有時需要檢查某位的值,例如,flags中1號位是否被設定位1?不能這樣直接比較flags和mask:

if(flags==mask)

puts(「wow」) //不能正常工作

這樣做即使flags的1號位為1,其他位的值會導致比較結果為假,因此,必須覆蓋flags中的其他位,只用1號位和mask比較。

if(flags&mask)==mask)

puts(「wow」)

比如flags=01010010 mask=00000010

按位與運算後,得到00000010,與mask相等,即可判斷1號位為1。

由於按位運算子的優先順序比==低,所以必須在flags &mask周圍加上圓括號。

為了避免資訊漏過邊界,掩碼至少要與其覆蓋的值寬度相同。

還沒關注的小夥伴,可以長按關注一下:

c 將小數化為二進位制 二進位制的轉換

二進位制是在計算機中常用的一種進製數,其資料用0和1兩個數碼來表示資料。我們人類常用的是十進位制,那麼二進位制和十進位制之間是有乙個轉換方法的。二進位制轉換十進位制 乙個二進位制數轉換為十進位制數,是比較簡單的,其方法就是用每乙個位置上的數字乘以該位置的權重,然後相加得到。舉個例子,二進位制的101...

用C 實現二進位制的減法(包括二進位制小數)

用c 實現二進位制的減法 包括二進位制小數 作為乙個大學汪,我開始接觸程式設計。前兩天老師讓寫乙個二進位制算術編碼,於是我遇到了這樣乙個問題,怎麼實現二進位制數的減法。熬了兩天的夜,寫出了下面的 若有不對的地方大家海涵 構建二進位制減法方法 二進位制減數 二進位制被減數 二進位制得數 public ...

c 將十進位制轉換為二進位制 小數 二進位制的轉換

二進位制是在計算機中常用的一種進製數,其資料用0和1兩個數碼來表示資料。我們人類常用的是十進位制,那麼二進位制和十進位制之間是有乙個轉換方法的。二進位制轉換十進位制 乙個二進位制數轉換為十進位制數,是比較簡單的,其方法就是用每乙個位置上的數字乘以該位置的權重,然後相加得到。舉個例子,二進位制的101...