2009-01-27 183 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寻找的是而不是作为解释,但有人为他写了他的代码。

相关问题