如何以二进制形式打印(使用 cout)数字?
我正在学习有关操作系统的大学课程,我们正在学习如何从二进制转换为十六进制,十进制转换为十六进制等,今天我们刚刚学习了如何使用二进制补码将有符号/无符号数字存储在内存中(~number + 1)。
我们需要在纸上做一些练习,我希望能够在将作业提交给老师之前验证我的答案。我为前几个练习编写了一个 C++ 程序,但现在我不知道如何通过以下问题验证我的答案:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
并且我们需要显示 的内存中的二进制表示a
、b
和 c
。
我已经在纸上完成了它,它给了我以下结果(二进制补码后数字的内存中的所有二进制表示形式):
a = 00111010(它是一个字符,所以 1 个字节)
b = 00001000(它是一个字符,所以 1 个字节)
c = 11111110 11000101(很短,所以 2 个字节)
有没有办法验证我的答案? C++ 中是否有标准方法来显示数字内存中的二进制表示形式,或者我是否必须自己编写每个步骤(计算二进制补码,然后转换为二进制)?我知道后者不会花那么长时间,但我很好奇是否有标准方法可以做到这一点。
I'm following a college course about operating systems and we're learning how to convert from binary to hexadecimal, decimal to hexadecimal, etc. and today we just learned how signed/unsigned numbers are stored in memory using the two's complement (~number + 1).
We have a couple of exercises to do on paper and I would like to be able to verify my answers before submitting my work to the teacher. I wrote a C++ program for the first few exercises but now I'm stuck as to how I could verify my answer with the following problem:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
and we need to show the binary representation in memory of a
, b
and c
.
I've done it on paper and it gives me the following results (all the binary representations in memory of the numbers after the two's complement):
a = 00111010 (it's a char, so 1 byte)
b = 00001000 (it's a char, so 1 byte)
c = 11111110 11000101 (it's a short, so 2 bytes)
Is there a way to verify my answer? Is there a standard way in C++ to show the binary representation in memory of a number, or do I have to code each step myself (calculate the two's complement and then convert to binary)? I know the latter wouldn't take so long but I'm curious as to if there is a standard way to do so.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
最简单的方法可能是创建一个
std::bitset
代表值,然后将其流式传输到 cout。The easiest way is probably to create an
std::bitset
representing the value, then stream that tocout
.使用即时转换为
std::bitset
。没有临时变量,没有循环,没有函数,没有宏。Live On Coliru
打印:
Use on-the-fly conversion to
std::bitset
. No temporary variables, no loops, no functions, no macros.Live On Coliru
Prints:
在 C++20 中,您可以使用
std::format
执行此操作:输出:
在较旧的系统上,您可以使用 {fmt} 库,
std::format
是基于 在。 {fmt} 还提供了print
功能,使这变得更加简单和高效(godbolt):免责声明:我是 {fmt} 和 C++20
std::format
的作者。In C++20 you can use
std::format
to do this:Output:
On older systems you can use the {fmt} library,
std::format
is based on. {fmt} also provides theprint
function that makes this even easier and more efficient (godbolt):Disclaimer: I'm the author of {fmt} and C++20
std::format
.如果要显示任何对象的位表示形式,而不仅仅是整数,请记住首先重新解释为 char 数组,然后可以将该数组的内容打印为十六进制,甚至打印为二进制(通过 bitset):
请注意最常见的系统是小尾数,因此
show_binrep(c)
的输出不是您期望的 1111111 011000101,因为事实并非如此它存储在内存中。如果您正在寻找二进制的值表示形式,那么一个简单的cout << bitset<16>(c)
有效。If you want to display the bit representation of any object, not just an integer, remember to reinterpret as a char array first, then you can print the contents of that array, as hex, or even as binary (via bitset):
Note that most common systems are little-endian, so the output of
show_binrep(c)
is not the 1111111 011000101 you expect, because that's not how it's stored in memory. If you're looking for value representation in binary, then a simplecout << bitset<16>(c)
works.没有。没有
std::bin
,如std::hex
或std::dec
,但输出数字二进制并不难你自己:你通过屏蔽所有其他位、左移并重复你拥有的所有位来输出最左边的位。
(类型中的位数为
sizeof(T) * CHAR_BIT
。)No. There's no
std::bin
, likestd::hex
orstd::dec
, but it's not hard to output a number binary yourself:You output the left-most bit by masking all the others, left-shift, and repeat that for all the bits you have.
(The number of bits in a type is
sizeof(T) * CHAR_BIT
.)与已经发布的类似,只需使用位移位和掩码来获取位;可用于任何类型,作为模板(
只是不确定是否有标准方法来获取 1 字节中的位数,我在这里使用了 8)。Similar to what is already posted, just using bit-shift and mask to get the bit; usable for any type, being a template (
only not sure if there is a standard way to get number of bits in 1 byte, I used 8 here).可重用函数:
用法:
这适用于所有类型的整数。
Reusable function:
Usage:
This works with all kind of integers.
使用 std::bitset 答案和便捷模板:
像这样使用它:
生成输出:
Using the std::bitset answers and convenience templates:
Using it like this:
Generates output:
我在玩在线竞技编码游戏时遇到过这个问题。这是一个可以快速实施并且相当直观的解决方案。它还避免输出前导零或依赖
但您应该注意,此解决方案会增加您的运行时间,因此,如果您正在竞争优化或根本不竞争,您应该使用其中之一本页的其他解决方案。
I have had this problem when playing competitive coding games online. Here is a solution that is quick to implement and is fairly intuitive. It also avoids outputting leading zeros or relying on
<bitset>
You should note however that this solution will increase your runtime, so if you are competing for optimization or not competing at all you should use one of the other solutions on this page.
使用旧的 C++ 版本,您可以使用以下代码片段:
Using old C++ version, you can use this snippet :
这是获取数字的二进制表示形式的真正方法:
Here is the true way to get binary representation of a number:
这是您要找的吗?
Is this what you're looking for?