我正在上一门 C++ 入门课程,并且想在十六进制表示和二进制之间转换字母。我可以使用以下方法打印出十六进制数字:
for(char c = 'a'; c <= 'z'; c++){
cout << hex << (int)c;
}
但我不能对二进制做同样的事情。没有std::bin
我可以用来将十进制数字转换为二进制的。
像这样:
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;
}
C++ 中没有二进制 io 操纵器。您需要手动执行覆盖,可能使用位移运算符。实际的转换不是一项艰巨的任务,因此应该在 C++ 初学者的能力范围内(而它未包含在标准库中的事实可能不是:))
编辑:很多其他人都举了例子,所以我要给出我喜欢的方法
void OutputBinary(std::ostream& out, char character)
{
for (int i = sizeof(character) - 1; i >= 0; --i)
{
out << (character >> i) & 1;
}
}
这也可能被模板化为任何数字类型。
对于多样性,您也可以使用 16 元素查找表来完成。
您可以轻松地编写十六进制字符与其二进制“半字节”之间的映射:
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";
};
你可以这样做:
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;
}
}
}
这听起来像是一项作业,在这种情况下,你真的应该向你的老师寻求帮助。从长远来看,从互联网上寻求家庭作业的解决方案并不能真正帮助你(除非你进入项目管理领域)。
在评论中回答 chustar(OQ'er),我必须同意,如果您了解如何做到这一点,它如何/为什么起作用,以及将来如何自己弄清楚,那么是的,那将是一件好事。
然而,他标记为“正确”的答案证明了这一论点是谎言。它只包含代码,以“Like so”开头。很明显,OQ'er 寻找的不是解释,而是有人为他编写代码。