2009-01-27 182 views
11

我正在開始C++類,並希望在十六進制表示和二進制之間轉換字母。我可以設法打印出十六進制數字使用:如何將十六進制數字轉換爲C++中的二進制文件?

for(char c = 'a'; c <= 'z'; c++){ 
    cout << hex << (int)c; 
} 

但我不能這樣做的二進制。沒有std::bin,我可以用來將十進制數轉換爲二進制。

+3

我建議你向我們展示一個示例輸入/輸出。 – xtofl 2009-01-27 14:40:37

回答

48

像這樣:

for(char c = 'a'; c <= 'z'; c++){ 
     std::bitset<sizeof(char) * CHAR_BIT> binary(c); //sizeof() returns bytes, not bits! 
     std::cout << "Letter: " << c << "\t"; 
     std::cout << "Hex: " << std::hex << (int)c << "\t"; 
     std::cout << "Binary: " << binary << std::endl; 
    } 
+3

我從來不知道這個!這正是OP想要的,我自己也學到了一些新東西。給予好評! – 2009-01-27 14:50:25

5

在C++中沒有二進制io操縱器。您需要手動執行覆蓋,可能通過使用bitshift運算符。實際的轉換不是一個困難的任務,所以應該在C++初學者的能力範圍內(而不包括在標準庫中的事實可能不是:))

編輯:許多其他人已經把所以我打算給我的首選方法

void OutputBinary(std::ostream& out, char character) 
{ 
    for (int i = sizeof(character) - 1; i >= 0; --i) 
    { 
    out << (character >> i) & 1; 
    } 
} 

這也可能被模板化爲任何數字類型。

+1

並在這裏再sizeof(字符)??你們是否從int的例子中得到了這個結論? – AndreasT 2010-01-26 12:21:40

4

對於各種各樣,你也可以使用16元素查找表。

+4

剛剛意識到我做了一個可怕的雙關語對不起:對不起:P – freespace 2009-01-27 14:42:14

+0

*呻吟* 是的,可怕的雙關語。 – 2009-01-27 14:48:33

1

你可以做這樣的事情:與十六進制charachters了他們的二進制 '啃'

for(char c = 'a'; c <= 'z'; c++){ 
    // char is 8 bits. print 4 bits 
    // at a time, starting with the MSB 
    for (int i = 4; i>=0; i-=4) { 
     switch (((int)c >> i) & 0xf) { 
      case 0: 
       cout << "0000"; 
       break; 
      case 1: 
       cout << "0001"; 
       break; 
      . 
      . 
      . 
      case 0xf: 
       cout << "1111"; 
       break; 


     } 
    } 
} 
2

你可以隨便寫一個映射:

std::string HexCharToNibble(char c) { 
switch (c) { 
    case '0': return "0000"; 
    case '1': return "0001"; 
    //... fill in the rest 
    case 'f': return "1111"; 
    default: assert(false); return "bad input"; 
}; 
+2

這個版本應該使用查找表完成。原始代碼需要一個字符的事實也會令人困惑。 – 2009-01-27 14:49:38

0

這聽起來像一個任務,在這種情況下,你真的應該問你的老師的幫助。從互聯網尋求家庭作業的解決方案從長遠來看並不能真正幫助你(除非你正在進行項目管理)。

在評論中回答chustar(OQ'er)時,我不得不同意,如果你明白怎麼做,如何/爲什麼會有效,以及如何在將來自己弄清楚,那麼是的這將是一件好事。

但是,他標記爲「正確」的答案對該論點置之不顧。它只包含代碼,前面加上「Like so」等字樣。這很清楚,OQ'er尋找的是而不是作爲解釋,但有人爲他寫了他的代碼。

相關問題