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

12

我正在学习C++入门课程,想要将字母转换为十六进制表示和二进制表示。我已经可以使用以下代码打印出十六进制数:

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

但是我无法像处理十进制那样处理二进制。没有std::bin可用于将十进制数转换为二进制。


3
我建议您向我们展示一个输入/输出的示例。 - xtofl
6个回答

49

就像这样:

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
我以前不知道这个!这正是原帖作者所想要的,我也学到了新东西。点赞! - Andrei Krotkov
1
尽管最好做成std::bitset<sizeof(char)>,以防万一。 - Andrei Krotkov
这个正确吗?std::bitset<8> binary(c) 将字符转换为其8位二进制表示,并将其存储在名为binary的变量中? - chustar
2
@chustar:你有包含 <bitset> 吗? - Harper Shelby
2
好像你应该包含<climits>并使用CHAR_BIT来除去那个8。 - unwind
显示剩余8条评论

5

C++中没有二进制IO操作符。您需要手动执行转换,可能使用位移操作符。实际的转换不是一个困难的任务,因此应该在C++初学者的能力范围内(虽然它不包括在标准库中)。

编辑:许多其他人已经提供了示例,所以我将提供我的首选方法。

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

这也可能被潜在地应用于任何数字类型的模板。

1
这里又出现了 sizeof(character) ?? 你们是从一个 int 的例子中复制粘贴过来的吗? - AndreasT

4

如果想要有些变化,你也可以使用一个16个元素的查找表来完成。


4
刚刚意识到我所做的双关语有多糟糕...抱歉 :P - freespace
是的,这个双关语很糟糕。 - Andrei Krotkov

2

您可以轻松编写十六进制字符和它们的二进制“nibbles”之间的映射:

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
这个版本一定要使用查找表来完成。原始代码采用字符会令人困惑。 - Andrei Krotkov

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;


        }
    }
}

0

这听起来像是一项作业,如果是这样的话,你真的应该向老师寻求帮助。从互联网上寻求作业解决方案并不能在长远来看帮助你(除非你要进入项目管理领域)。

回答评论中的chustar(原问题提出者),我必须同意,如果你理解如何做到它,它是如何/为什么工作的,并且知道如何在将来自己解决它,那么是一个好事情。

然而,他标记为“正确”的答案证明了这个论点是错误的。它只包含代码,以“像这样”开头。很明显,原问题提出者想要的不是解释,而是有人为他编写代码。


这是一项作业,只要我理解如何完成它,或者它是如何/为什么工作的,它是否来自互联网或TA并不重要。 - chustar
3
此外,Ted,考虑到Harper Shelby上面的回答教给了我(并且根据评论还有其他几个人)一些新的、有用的知识,我认为这个问题值得点赞。 - Nathan Fellman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接