2013-01-01 56 views
3

可能重複:
Can I use a binary literal in C or C++?我不能打印位運算符的結果

我不能在下面的代碼中C.顯示位運算符的結果,一個& b應該是100001和a | b 111111.但是,打印結果不同。我試圖用itoa和itoa來做這件事,但無濟於事。爲什麼程序不能正確打印答案?

#include<stdio.h> 
#include<stdlib.h> 

int main (int argc, char* argv[]) { 

    unsigned a = 101101; 
    unsigned b = 110011; 

    unsigned c = a&b; 
    unsigned d = a|b; 

    char s[100]; 
    char t[100]; 

    itoa(c,s,2); 
    itoa(d,t,2); 

    printf("%s\n",s); /* Shouldn't it produce 100001? 
         Instead I get 11000100010101001*/ 
    printf("%s\n",t); /* Ought to print 111111. 
         Instead it prints 11010111111111111 */ 

    return 0; 
} 

謝謝

+0

聽起來像你想要二進制文字,看到這個問題http://stackoverflow.com/questions/2611764/can-i-use-a-binary-literal-in-c-or-c – WildCrustacean

+0

由於鏈接的問題建議使用Boost C++庫,我會建議它不是一個很好的匹配。 –

+0

鏈接的問題確實涵蓋了C/C++,但它也表示BOOST_BINARY可以用於C.這只是一個答案,那裏還有很多其他相關信息。 – WildCrustacean

回答

8

您提供的數字是小數,而你想用的是二進制文件。請嘗試以下操作:

unsigned a = 0x2d; // 101101 b 
unsigned b = 0x33; // 110011 b 

或爲GCC編譯器使用:

unsigned a = 0b101101; 
unsigned b = 0b110011; 
+0

a'b'後綴?這是新的!它是_C99_? –

+0

至少,這不是C++的C++默認標準。 –

+1

哎呀,意味着GCC的延伸,睡眠太少。編輯... –

1

你需要表達你的號碼爲十進制(如101101變成45,110011變爲51),ocatal(101101變爲055, 110011是063)或十六進制(如Eli顯示,0x2d和0x33分別)。

一些編譯器可以支持二進制,但大多數不支持。直接用二進制工作是痛苦的,一旦數字的長度大於8-12位,那麼學習如何使用二進制工作於十六進制(最常見的是現在)或八進制(以前在二十世紀七十年代流行,特別是在DEC設備上它使用了很多3位組合,所以它是有意義的)。

您當然可以使用strtol(str, NULL, 2)將二進制字符串轉換爲長整型值。

+0

謝謝。我只需要檢查使用按位運算符的代碼。十六進制似乎是最直接的方式。 – saad

1

您定義的整數(a和b)未使用位定義。你已經定義了101101和110011的整數。所以即使有適當的顯示,這也是行不通的。

我建議你獲得更多或更少,你想要的是:

首先正確地定義你的電話號碼。一些C編譯器(據我所知,這不是標準的)定義了位表示法,所以a將是:0b101101和b將b:0b110011。這樣的話:

unsigned a = 0b101101;

unsigned b = 0b110011;

否則,您必須在10個鹼基使用十六進制表示法(0X ....),或直接要麼定義它們。在第一種情況下,a將爲:0x2d或45.

此外,對於顯示器,您無法顯示位。因此,您應該使用十六進制符號(它更適合那種類型的東西)顯示,使用:printf("c: %#x", c);

它將輸出:c: 0x21

+0

由於目標是顯示一個二進制數,我可以將它轉換爲基本的兩個字符串使用itoa並打印出來。 – saad