【问题标题】:how to output an int in binary?如何以二进制输出int?
【发布时间】:2011-03-17 05:37:00
【问题描述】:
int x = 5;
cout<<(char)x;

上面的代码以原始二进制形式输出一个 int x,但只有 1 个字节。我需要它做的是将 x 输出为 4 字节的二进制文件,因为在我的代码中,x 可以在 0 到 2^32-1 之间的任何位置,因为

cout<<(int)x;

不成功,我该怎么做?

【问题讨论】:

  • 有什么关系?他发布了到目前为止他正在尝试做的事情以及为什么他的代码不起作用并提出了一个明确的问题。
  • 这不太可能适用于cout,因为您无法控制它的打开方式。如果您想进行二进制输出,请打开您自己的流并在您的 openmmode 参数中包含 ios_base::binary 标志。

标签: c++ binary type-conversion


【解决方案1】:

有点晚了,但正如 Katy 在她的博客中所展示的,这可能是一个优雅的解决方案:

#include <bitset>
#include <iostream>

int main(){
  int x=5;
  std::cout<<std::bitset<32>(x)<<std::endl;
}

取自: https://katyscode.wordpress.com/2012/05/12/printing-numbers-in-binary-format-in-c/

【讨论】:

  • 可能是最合理的答案。它确实假设我们正在谈论一个 32 位 int,但我们几乎在所有其他答案中也做出了这样的假设。
  • @v010dya 您可以执行类似 std::bitset (或 std::bitset)的操作来避免这些假设。
  • 我认为重要的是要注意这个答案并没有回答问题。
【解决方案2】:

你可以使用std::ostream::write()成员函数:

std::cout.write(reinterpret_cast<const char*>(&x), sizeof x);

请注意,您通常希望对已以二进制模式打开的流执行此操作。

【讨论】:

    【解决方案3】:

    试试:

    int x = 5;
    std::cout.write(reinterpret_cast<const char*>(&x),sizeof(x));
    

    注意:以二进制格式写入数据是不可移植的。
    如果您想在另一台机器上阅读它,您需要具有完全相同的架构,或者您需要标准化格式并确保所有机器都使用标准格式。

    如果你想编写二进制格式,最简单的标准化格式的方法是将数据转换为网络格式(htonl() ntohl() 等有一组函数)

    int x = 5;
    u_long  transport = htonl(x);
    std::cout.write(reinterpret_cast<const char*>(&transport), sizeof(u_long));
    

    但最可移植的格式是只转换为文本。

    std::cout << x;
    

    【讨论】:

    • htonl 和 ntohl 定义在哪里?我在reference 中找不到它们。
    • @RafaelCamposNunes:它不是 C++ 标准的一部分。它是 POSIX 标准的一部分。 linux.die.net/man/3/htonl
    • 哦,我明白了。所以它不是很便携。
    • @RafaelCamposNunes 这意味着它不是语言标准的一部分(因为该语言与硬件无关(因此它不能成为该标准的一部分))。它是平台标准的一部分,作为平台必须了解硬件细节。所有现代操作系统都支持 POSIX 标准。只有在使用微控制器或没有操作系统的情况下才会遇到问题。
    • 据我所知,现代版本的 Windows 不支持 POSIX。
    【解决方案4】:

    那么这个呢?

    int x = 5;
    cout<<(char) ((0xff000000 & x) >> 24);
    cout<<(char) ((0x00ff0000 & x) >> 16);
    cout<<(char) ((0x0000ff00 & x) >> 8);
    cout<<(char) (0x000000ff & x);
    

    【讨论】:

    • 很可能这比其他答案更正确——原始问题没有指定“用二进制写入”如何。如果它是“但是它恰好在内存中”,那是一回事,但是如果您试图与其他任何东西兼容,那么您可能希望(例如)始终以网络字节顺序写入 32 位长,正如这个答案所做的那样(以一些兼容性问题为模)
    【解决方案5】:

    一些提示。

    首先,要介于 0 和 2^32 - 1 之间,您需要一个 无符号 四字节整数。

    其次,从x(&x)的地址开始的四个字节已经有了你想要的字节。

    这有帮助吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多