int x = 5;
cout<<(char)x;
上記のコードは、生のバイナリでint xを出力しますが、1バイトのみです。私のコードでは、xは0から2 ^ 32-1の間のどこかにある可能性があるため、xをバイナリで4バイトとして出力する必要があります。
cout<<(int)x;
トリックをしません、どうすればいいですか?
std::ostream::write()
メンバー関数を使用できます。
std::cout.write(reinterpret_cast<const char*>(&x), sizeof x);
通常、バイナリモードで開かれたストリームを使用してこれを実行する必要があることに注意してください。
少し遅れましたが、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/
試してみてください:
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;
そしてこれはどうですか?
int x = 5;
cout<<(char) ((0xff000000 & x) >> 24);
cout<<(char) ((0x00ff0000 & x) >> 16);
cout<<(char) ((0x0000ff00 & x) >> 8);
cout<<(char) (0x000000ff & x);
いくつかのヒント。
まず、0から2 ^ 32-1の間にあるためには、nsigned 4バイト整数が必要です。
次に、x(&x)のアドレスで始まる4バイトには、必要なバイトがすでに含まれています。
それは役に立ちますか?