2010-07-17 29 views
11
int x = 5; 
cout<<(char)x; 

上面的代碼在原始二進制中輸出一個int x,但只有1個字節。我需要做的是輸出X作爲4個字節的二進制,因爲在我的代碼中,x可以是之間的任何0和2^32-1,因爲如何在二進制中輸出一個int?

不會做的伎倆,我會怎麼做?

+2

這有什麼關係:

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

取自?他發佈了他迄今爲止試圖做的事情,以及爲什麼他的代碼無法正常工作,並提出了明確的問題。 – 2010-07-17 01:09:00

+0

這對於'cout'來說不太可能,因爲你無法控制它的打開方式。如果你想做二進制輸出,打開你自己的流並在'openmmode'參數中包含'ios_base :: binary'標誌。 – 2010-07-17 01:34:25

回答

9

可以使用std::ostream::write()成員函數:

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

請注意,您通常會希望與已在二進制模式被打開流來做到這一點。

+0

好的,我會記住這一點,謝謝! – user299648 2010-07-17 01:20:52

2

嘗試:

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; 
1

一些提示。

首先,要在0和2^32 - 1之間,您需要一個無符號的四字節int。其次,從x的地址(& x)開始的四個字節已經有了你想要的字節。

這有幫助嗎?

2

這又如何?

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

+0

很可能這是比正確的軌道比其他答案 - 原始問題沒有指定「寫入二進制」*如何*。如果它「正好在內存中」,那是一回事,但如果你試圖與其他任何東西兼容,那麼你可能想(例如)總是按網絡字節順序寫一個32位長的文件,因爲這個答案確實(取決於一些兼容性問題) – hobbs 2010-07-17 02:18:31

24

有點晚了,但是,正如凱蒂顯示在她的博客,這可能是一個完美的解決方案: https://katyscode.wordpress.com/2012/05/12/printing-numbers-in-binary-format-in-c/

+4

可能是最合理的答案。它確實假設我們正在談論32位整數,但我們也在幾乎所有其他答案中都做出了這樣的假設。 – v010dya 2016-04-25 14:58:09

+4

@ v010dya您可以執行類似std :: bitset (或std :: bitset 的操作來避免這些假設。 – Conchylicultor 2017-01-16 02:41:23

+0

我認爲重要的是要注意,這個答案沒有回答這個問題。 – Tkdestroyer2 2018-02-19 07:30:06