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

Posted

技术标签:

【中文标题】如何在 C++ 中将十六进制数字转换为二进制?【英文标题】:How can I convert hexadecimal numbers to binary in C++? 【发布时间】:2010-10-03 18:33:34 【问题描述】:

我正在学习 C++ 初级课程,并且想在十六进制表示和二进制之间转换字母。我可以使用以下方法打印出十六进制数字:

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

但我不能对二进制做同样的事情。没有std::bin 可用于将十进制数转换为二进制数。

【问题讨论】:

我建议您向我们展示一个输入/输出示例。 【参考方案1】:

C++ 中没有二进制 io 操纵器。您需要手动执行覆盖,可能使用位移运算符。实际的转换并不是一项艰巨的任务,因此应该在 C++ 初学者的能力范围内(而它未包含在标准库中的事实可能不是:))

编辑:很多人都举了例子,所以我将给出我喜欢的方法

void OutputBinary(std::ostream& out, char character)

  for (int i = sizeof(character) - 1; i >= 0; --i)
  
    out << (character >> i) & 1;
  

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

【讨论】:

这里又是 sizeof(character) ??你们是从 int 的一个例子中 c&p 的吗?【参考方案2】:

为了多样化,您还可以使用 16 元素查找表来实现。

【讨论】:

刚刚意识到我做了一个多么糟糕的双关语......对不起:P 呻吟是的,糟糕的双关语。【参考方案3】:

你可以这样做:

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;


        
    

【讨论】:

【参考方案4】:

您可以轻松地编写十六进制字符与其二进制“半字节”之间的映射:

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";
;

【讨论】:

这个版本绝对应该使用查找表来完成。原始代码采用 char 的事实也会令人困惑。【参考方案5】:

像这样:

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;
    

【讨论】:

我从来不知道这个!这正是 OP 想要的,我自己也学到了一些新东西。点赞! 尽管最好将其设置为 std::bitset 以防万一。 哇...这真的很酷。我希望我能多次投票。尽管如此,尽管您的答案很棒,但您为家庭作业问题提供代码感到羞耻。 @chustar: 你#include 了吗? 听起来你应该包含&lt;climits&gt; 并使用CHAR_BIT 来摆脱那个8。【参考方案6】:

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

在 cmets 中回答 chustar(OQ'er),我必须同意,如果您了解如何做到这一点,它如何/为什么工作,以及如何在未来自己弄清楚,那么是的,这将是一件好事。

但是,他标记为“正确”的答案证明了该论点是谎言。它只包含代码,以“Like so”开头。很明显,OQ'er 正在寻找的不是 解释,而是有人为他编写代码。

【讨论】:

这是一项任务,只要我了解如何去做,或者它如何/为什么工作,它是来自互联网还是来自 TA 真的很重要吗? 此外,Ted,鉴于上面 Harper Shelby 的回答教会了我(从 cmets 和其他一些人的角度来看)一些新的和有用的东西,我认为这个问题赢得了它的支持

以上是关于如何在 C++ 中将十六进制数字转换为二进制?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将字符从字母字符转换为十六进制数字?

如何在 C++ 中将字节数组转换为十六进制字符串?

如何在 C++ 中将十六进制字符串转换为字节字符串? [复制]

在 C++ 中将十六进制字符转换为 int

如何在 Visual C++ 中将字节数组转换为十六进制字符串?

在 C++ 中将十六进制转换为整数的最快方法是啥?