注:我們預設1個位元組用8個位 ,編號分別為7~1。
實際上,二進位制表示法只能精確地表示多個1/2的冪的和,如3/4, 7/8,而1/3, 2/5等是無法精確表示的。
粗暴理解就是男性和女性能生出孩子,否則就不行。不允許共存。
異或運算其實就是半加器運算,不進製
0 xor 0 =0異或實際上就是判斷兩個輸入邏輯值是否不同,如果不同則結果為1,相同則為0。若a=0,b=0,a異或b 兩數相同,輸出結果為0,結果與b相同;0 xor 1 =1
1 xor 1 =(1) 0
1 xor 0 =1
若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中除1號位以外的所有位都設定為0,因為使用按位與運算子(&)任何位與0組合都得0,1號位的值不變,(如果1號位是1,那麼1&1得1;如果1號位是0,那麼0&1=0),這個過程叫使用掩碼,因為掩碼中的0隱藏了flags中相應的位。flags = flags & mark;
可以這樣模擬,把掩碼中的0看做不透明,1看做透明,表示式flags&mask相當於用掩碼覆蓋在flags的位組合上,只有mask為1的位才可見。
有時,需要開啟乙個值中的特定位,同時保持其他位不變。
例如一台ibm pc 通過向埠傳送值來控制硬體,例如,為了開啟內建揚聲器,必須開啟一號位,同時保持其他位不變,這種情況可以使用按位或運算子(|)。
flag=00001111b這樣,(00001111)|(10110110)=(10111111)mark=10110110b
flags |=mark;
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其結果為00001001,(00001111)&~(10110110)
mask中為1的位在結果中都被設定(清空)為0,flags中與mark為0的位相應的位在結果中都未改變。
可以使用以下的簡化形式:
flags &=~mark;切換位指的是開啟已關閉的位,或關閉已開啟的位,可以使用按位異或運算子(^)切換位。
flags =flags ^mask;例如,假設flags是00001111,mask是10110110,flags ^=mask;
flags ~mask其結果為:(00001111)^(10110110);
(10111001)flags中與mas為1的位相對應的位都被切換了,mask為0的位相對應的位不變。
有時需要檢查某位的值,例如,flags中1號位是否被設定位1?不能這樣直接比較flags和mask:
if(flags==mask)這樣做即使flags的1號位為1,其他位的值會導致比較結果為假,因此,必須覆蓋flags中的其他位,只用1號位和mask比較。puts(「wow」) //不能正常工作
if(flags&mask)==mask)按位與運算後,得到00000010,與mask相等,即可判斷1號位為1。puts(「wow」)
比如flags=01010010 mask=00000010
由於按位運算子的優先順序比==低,所以必須在flags &mask周圍加上圓括號。
為了避免資訊漏過邊界,掩碼至少要與其覆蓋的值寬度相同。
還沒關注的小夥伴,可以長按關注一下:
c 將小數化為二進位制 二進位制的轉換
二進位制是在計算機中常用的一種進製數,其資料用0和1兩個數碼來表示資料。我們人類常用的是十進位制,那麼二進位制和十進位制之間是有乙個轉換方法的。二進位制轉換十進位制 乙個二進位制數轉換為十進位制數,是比較簡單的,其方法就是用每乙個位置上的數字乘以該位置的權重,然後相加得到。舉個例子,二進位制的101...
用C 實現二進位制的減法(包括二進位制小數)
用c 實現二進位制的減法 包括二進位制小數 作為乙個大學汪,我開始接觸程式設計。前兩天老師讓寫乙個二進位制算術編碼,於是我遇到了這樣乙個問題,怎麼實現二進位制數的減法。熬了兩天的夜,寫出了下面的 若有不對的地方大家海涵 構建二進位制減法方法 二進位制減數 二進位制被減數 二進位制得數 public ...
c 將十進位制轉換為二進位制 小數 二進位制的轉換
二進位制是在計算機中常用的一種進製數,其資料用0和1兩個數碼來表示資料。我們人類常用的是十進位制,那麼二進位制和十進位制之間是有乙個轉換方法的。二進位制轉換十進位制 乙個二進位制數轉換為十進位制數,是比較簡單的,其方法就是用每乙個位置上的數字乘以該位置的權重,然後相加得到。舉個例子,二進位制的101...