如何使用cout打印二进制格式的数字?

308

我正在学习一门关于操作系统的大学课程,我们正在学习如何将二进制转换为十六进制、十进制转换为十六进制等,今天我们刚刚学习了如何使用二进制补码(~number + 1)在内存中存储带符号/无符号数。

我们有几个练习题需要手写计算,但在提交作业给老师之前我想要验证我的答案是否正确。我已经用C++编写了前几个问题的程序,但现在卡在如何验证以下问题的答案上:

char a, b;

short c;
a = -58;
c = -315;

b = a >> 3;

我们需要显示abc在内存中的二进制表示。

我已经手写计算了它们的二进制补码,并得到以下结果:

a = 00111010(它是一个字符,所以1个字节)

b = 00001000(它是一个字符,所以1个字节)

c = 11111110 11000101(它是一个短整型,所以2个字节)

有没有一种方法可以验证我的答案?在C++中是否有标准的方法来显示数字在内存中的二进制表示,还是我必须自己编写每个步骤的代码(计算二进制补码,然后转换为二进制)?我知道后者不会花费太长时间,但我想知道是否有一种标准的方式来这样做。


3
你了解十六进制表示吗?如果了解,你可以打印十六进制表示(使用“std::hex”)操作符 - 我会让你练习处理其余的内容... - Nim
4
你很强调“内存”这个词,但我希望他们没有让你去处理字节序问题。 - Mark Ransom
1
你知道字节序是什么吗?如果知道,那么对于这个练习你是否关心它呢?这些问题的答案可能会影响你的问题的答案。 - R. Martinho Fernandes
3
就像这样,即使是 Google 也会这样做,例如 “-58 in binary”。但是想要自己在代码中找到如何实现的话,可以给予加1赞扬。 - Konrad Rudolph
即使只是一瞥,所有这些数字看起来都是错误的。 -58 是负数,所以我立刻知道第一个位应该是 1,但你的答案第一个位是 0。而且 00111010 右移 3 位是 000 00111,没有任何数学运算,所以那个答案也是错误的。 - Mooing Duck
显示剩余2条评论
13个回答

0
我在玩在线竞技编程游戏时遇到了这个问题。这里提供一个快速实现且相当直观的解决方案。它还避免了输出前导零或依赖于<bitset>
std::string s;
do {
    s = std::to_string(r & 1) + s;
} while ( r>>=1 );

std::cout << s;

然而,您应该注意到这个解决方案会增加您的运行时间,因此如果您正在竞争优化或根本不参与竞争,您应该使用本页面上的其他解决方案之一。


这正是我正在寻找的确切解决方案,“以二进制形式打印,同时避免输出前导零”。 - undefined

-5

这是获取一个数字的二进制表示的真正方法:

unsigned int i = *(unsigned int*) &x;

1
不,这只是将 x 复制到 i 中。除非你是开玩笑? - adentinger

-13

这是你要找的吗?

std::cout << std::hex << val << std::endl;

35
Moderator注意:我试图有选择性地清除这个回答下的敌对或其他非建设性的评论,但最终导致了一个非常混乱的对话。所有评论都被清除了。请保持评论专业、建设性,并且最重要的是围绕主题。如果OP想要删除这个回答,那么OP现在应该已经删除了它。如果您不同意这个答案,请投票。如果您可以改善这个答案,请编辑。实际上,我们都是成年人,对吧?我几乎检查了所有在这里发表评论的人的年龄,以确保每个人都超过13岁。 - Tim Post

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