如何在 C++ 中将十六进制数转换为二进制数?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/483609/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I convert hexadecimal numbers to binary in C++?
提问by chustar
I am taking a beginning C++ class, and would like to convert letters between hex representations and binary. I can manage to print out the hex numbers using:
我正在学习 C++ 入门课程,并且想在十六进制表示和二进制之间转换字母。我可以使用以下方法打印出十六进制数字:
for(char c = 'a'; c <= 'z'; c++){
cout << hex << (int)c;
}
But I can't do the same for binary. There is no std::bin
that I can use to convert the decimal numbers to binary.
但我不能对二进制做同样的事情。没有std::bin
,我可以使用的十进制数转换为二进制。
回答by Harper Shelby
Like so:
像这样:
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;
}
回答by workmad3
There isn't a binary io manipulator in C++. You need to perform the coversion by hand, probably by using bitshift operators. The actual conversion isn't a difficult task so should be within the capabilities of a beginner at C++ (whereas the fact that it's not included in the standard library may not be :))
C++ 中没有二进制 io 操作器。您需要手动执行覆盖,可能是使用位移运算符。实际的转换并不是一项艰巨的任务,因此应该在 C++ 初学者的能力范围内(而它不包含在标准库中的事实可能不:))
Edit: A lot of others have put up examples, so I'm going to give my preferred method
编辑:很多其他人都举了例子,所以我要给出我喜欢的方法
void OutputBinary(std::ostream& out, char character)
{
for (int i = sizeof(character) - 1; i >= 0; --i)
{
out << (character >> i) & 1;
}
}
This could also be potentially templated to any numeric type.
这也可能被模板化为任何数字类型。
回答by freespace
For bit of variety, you can also do it using a 16 element look up table.
对于一些变化,您也可以使用 16 元素查找表来完成。
回答by xtofl
You can easily write a mapping between the hex charachters an their binary '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";
};
回答by Nathan Fellman
You can do something like this:
你可以这样做:
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;
}
}
}
回答by T.E.D.
This sounds like an assignment, in which case you really should ask your teacher for help. Soliciting solutions to homework from the internet isn't really going to help you in the long run (unless you are going into project management).
这听起来像是一项作业,在这种情况下,你真的应该向你的老师寻求帮助。从长远来看,从互联网上征求家庭作业的解决方案并不能真正帮助您(除非您要从事项目管理)。
Answering chustar (the OQ'er) in the comments, I'd have to agree that if you understand how to do it, how/why it works,and how to figure it out yourself in the future, then yes, that would be a good thing.
在评论中回答 chustar(OQ'er),我必须同意,如果您了解如何做,如何/为什么工作,以及如何在未来自己弄清楚,那么是的,那就是一件好事。
However, the answer he marked "correct" puts the lie to that argument. It contains nothing but code, prefaced with the words "Like so". It's pretty clear that what the OQ'er was looking for was notfor an explanation, but for someone to write his code for him.
然而,他标记为“正确”的答案为该论点提供了谎言。它只包含代码,以“像这样”开头。很明显,OQ'er 寻找的不是解释,而是有人为他编写代码。