如何在C ++中将十六进制数转换为二进制?

时间:2009-01-27 14:32:37

标签: c++ binary hex

我正在开始使用C ++类,并希望在十六进制表示和二进制之间转换字母。我可以设法使用:

打印出十六进制数字
for(char c = 'a'; c <= 'z'; c++){
    cout << hex << (int)c;
}

但我不能对二进制文件做同样的事情。我可以使用std::bin将十进制数转换为二进制数。

6 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分: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;
  }
}

这也可能被模板化为任何数字类型。

答案 2 :(得分:4)

对于多种多样,您也可以使用16元素查找表来完成。

答案 3 :(得分: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";
};

答案 4 :(得分:1)

您可以这样做:

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;


        }
    }
}

答案 5 :(得分:0)

这听起来像是一项任务,在这种情况下,你真的应该向老师寻求帮助。从互联网上寻求家庭作业的解决方案从长远来看并不会对你有所帮助(除非你进入项目管理)。

在评论中回答chustar(OQ'er),我必须同意如果你明白怎么做,它是如何/为什么有效,以及如何在将来弄明白,那么是的,这将是一件好事。

但是,他标记为“正确”的答案将谎言置于该论点之上。它只包含代码,前面加上“Like so”字样。很明显,OQ'er所寻找的是作为解释,但是有人为他编写代码。