在c語言的printf中不能直接顯示乙個數字的二進位制。
但我們可以通過位運算獲取數字每一位的值然後顯示。
我們以25
為例子,其二進位制為1101
,那麼我們要獲取其最底位的值就是1
。
通過位與運算1101 & 0001 = 0001
可以得到結果。
同理,我們若想獲得其第二位的值也是同理,只需要把第二位變成最小位即可,(1101 >> 1) & 0001 = 0110 & 0001 = 0000
。
借助此,我們可以寫出如下函式:
void
printbit
(unsigned
int num)
printf
("\n");
}
但是,實際效果卻不太理想。他把顯示的數值倒了過來。
當然,處理的方法有很多,我的方法是再做乙個函式用於把數值倒過來。
我們只需要把num = 00000000000000000000000000011001
變成num = reverse_bits(num) = 10011000000000000000000000000000
即可。
reverse_bits
的**如下:
unsigned
intreverse_bits
(unsigned
int num)
return answer;
}
同理,變數bit
是指num
的最低位的值,我們要講這個值寫到answer
中。
然後,讓answer
向左移位一位,效果如下:
10011
最底位是0001
寫入到answer:
answer = 0001 & 0000 = 0001
移位:answer = 0010
再重複剛剛的步驟:
bit = 0
answer = 0010
answer = 0100
再重複剛剛的步驟:
bit = 1
answer = 0101
answer = 1010
再重複剛剛的步驟:
bit = 1
answer = 1011
最終便可以轉換完成。
注意:我們使用了unsigned int i=1;i != 0;i <<= 1
來計算整數二進位制的總位數。
如,系統計算整數的位數是5位,那麼就會有如下效果:
i = 00001
,然後經過4次移位,得到i = 10000
。當第五次時i = 00000 = 0
,迴圈結束。
注意:25
也就是1101
,倒過來的結果並不是1011
。
因為系統內儲存25
的二進位制是:00000000000000000000000000011001
,
所以倒過來後是:10011000000000000000000000000000
。
當然,不同的編譯器結果可能是不同的。
二進位制位運算
與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...
更新二進位制位
問題描述 給出兩個32位的整數n和m,以及兩個二進位制位的位置i和j。寫乙個方法來使得n中的第i到j位等於m m會是n中從第i為開始到第j位的子串 日期 2017 8 22 思路 由於題目的提示中已經給出,i到j有足夠的空間放置m,將n中的第i到j之間的數字全部置為0,最後與m異或即可 includ...
二進位制位運算
一 按位與 位全為1,結果才為1 0 0 0 0 1 0 1 0 0 1 1 1 特殊用法 清零。如果想將乙個單元清零,就是使其全部二進位制位為0,只要與乙個各位都為零的數值相與,結果為零 取乙個數中的指定位。如x 10101110要取x的低4位,用x 00001111 00001110即可 二 按...