咱們知道
在彙編語言中,16進制的數能夠表示爲0FH,2進制的數能夠表示爲00001111B
在c語言中,16進制的數能夠表示爲0x0F,可是沒法直接表示00001111二進制數
1、解決方法
能夠用一個宏來解決
#define BIN(x) \
( \
((x)&0x01) |\
(((x/10)&0x01)<<1)&0x02 |\
(((x/100)&0x01)<<2)&0x04 |\
(((x/1000)&0x01)<<3)&0x08 |\
(((x/10000)&0x01)<<4)&0x10 |\
(((x/100000)&0x01)<<5)&0x20 |\
(((x/1000000)&0x01)<<6)&0x40 |\
(((x/10000000)&0x01)<<7)&0x80 \
)
2、例子驗證
這個宏適合8位的二進制數,下面舉個例子
我想表示2進制數10001101
只須調用宏BIN(10001101),下面在VC6.0上驗證過
/*------------------------test.c start---------------------------------*/
#include<stdio.h>
#define BIN(x) \
( \
((x)&0x01) |\
(((x/10)&0x01)<<1)&0x02 |\
(((x/100)&0x01)<<2)&0x04 |\
(((x/1000)&0x01)<<3)&0x08 |\
(((x/10000)&0x01)<<4)&0x10 |\
(((x/100000)&0x01)<<5)&0x20 |\
(((x/1000000)&0x01)<<6)&0x40 |\
(((x/10000000)&0x01)<<7)&0x80 \
)
int main(){
printf("10001011B = %xH \n",BIN(10001011));
return 0;
}
/*------------------------test.c end---------------------------------*/
顯示的結果是
10001011B = 8b H
Press any key to continue_
3、設計思想
好比10001011,通常狀況,編譯器將它當成long int類型。
咱們要把每一位是1或者0的狀況記錄下來
1.第一次記錄最低位,若是是0,轉換後的二進制數的最低位也是0,若是是1,轉換後的二進制數的最低位也是1。因此,第一句是 (10001011)&0x01 ,使用掩碼0x01。若是最低位是0,則結果爲0x00;若是最低位是1,則結果是0x01。
此例中(10001011)&0x01 結果爲0x01,二進制爲0000 0001
2.如今記錄第二位,有一點要記得,當10001011除以10後,十位數就變成個位數了,並且此時能夠用掩碼0x01判斷,狀況同上。能夠知道結果是0x01,二進制爲0000 0001,可是這應該是在第二位啊!
簡單,在(10001011)&0x01的結果再左移一位,而後造成掩碼0x02,主要來判斷第二位,即與0x02與。
所以寫成 ( ( (10001011)&0x01 ) << 1 ) & 0x02
抽象一下 ( ( (x) & 0x01 ) << 1 ) & 0x02
3.若是是第三位呢?( ( (x) & 0x01 ) << 2 ) & 0x04
4.依次類推……
4、不足之處
1.修改比較麻煩……
2.若是是00001111,必須寫成1111,否則就錯了。
高手若是有什麼意見或者改進方法,請留言o(∩_∩)o...
5、改進
主要是對問題的第二點
#define BIN(x) \
( \
((1x)&0x01) |\
(((1x/10)&0x01)<<1)&0x02 |\
(((1x/100)&0x01)<<2)&0x04 |\
(((1x/1000)&0x01)<<3)&0x08 |\
(((1x/10000)&0x01)<<4)&0x10 |\
(((1x/100000)&0x01)<<5)&0x20 |\
(((1x/1000000)&0x01)<<6)&0x40 |\
(((1x/10000000)&0x01)<<7)&0x80 \
)
在宏定義中的x中前加1
這個我就不解釋,理解的關鍵是在因而否清楚編譯程序的過程,對宏的處理
這個能夠去查看相關的書籍