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

उपरोक्त कोड कच्चे बाइनरी में एक int x आउटपुट करता है, लेकिन केवल 1 बाइट। क्या मैं इसे करने की ज़रूरत है, उत्पादन क्योंकि मेरे कोड में बाइनरी में 4-बाइट, के रूप में एक्स, एक्स कहीं भी 0 और 2 32-1 के बीच^हो सकता हैद्विआधारी में int को आउटपुट कैसे करें?

के बाद चाल नहीं करता है, मैं यह कैसे करूंगा?

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

ध्यान दें कि आप आमतौर पर एक धारा द्विआधारी मोड में खोल दिया गया है उस के साथ ऐसा करना चाहते हैं:

+2

इससे क्या फर्क पड़ता:

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

से लिया? उन्होंने पोस्ट किया कि वह अब तक क्या करने की कोशिश कर रहा था और उसका कोड क्यों काम नहीं कर रहा था और एक स्पष्ट सवाल पूछा। –

+0

'cout' के साथ अच्छी तरह से काम करने की संभावना नहीं है, क्योंकि आपके पास यह खोला गया है कि इस पर नियंत्रण नहीं है। यदि आप बाइनरी आउटपुट करना चाहते हैं, तो अपनी खुद की स्ट्रीम खोलें और 'ios_base :: बाइनरी' ध्वज को अपने 'openmmode' तर्क में शामिल करें। –

उत्तर

9

आप std::ostream::write() सदस्य फ़ंक्शन का उपयोग कर सकते हैं।

+0

ठीक है, मैं इसे ध्यान में रखूंगा, धन्यवाद! – user299648

2

प्रयास करें:

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

नोट: द्विपदीय प्रारूप में यही writting डेटा गैर पोर्टेबल है।
यदि आप इसे वैकल्पिक मशीन पर पढ़ना चाहते हैं तो आपको या तो बिल्कुल वही आर्किटेक्चर होना चाहिए या आपको प्रारूप को मानकीकृत करने की आवश्यकता है और सुनिश्चित करें कि सभी मशीन मानक प्रारूप का उपयोग करें।

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

आप द्विआधारी लिखने के प्रारूप के मानकीकरण के लिए सबसे आसान तरीका चाहते हैं नेटवर्क प्रारूप करने के लिए डेटा परिवर्तित करने के लिए है (> ntohl() आदि वहाँ) कि htonl के लिए कार्य का एक सेट (< है)

लेकिन सबसे अधिक परिवहन योग्य प्रारूप केवल टेक्स्ट में कनवर्ट करना है।

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

24

एक थोड़ी देर हो चुकी है, लेकिन, के रूप में कैटी ने अपने ब्लॉग में पता चलता है, यह एक सुरुचिपूर्ण समाधान हो सकता है: https://katyscode.wordpress.com/2012/05/12/printing-numbers-in-binary-format-in-c/

+4

शायद सबसे उचित उत्तर।यह मानता है कि हम 32-बिट int के बारे में बात कर रहे हैं, लेकिन हम लगभग हर दूसरे उत्तर में ऐसी धारणाएं भी कर रहे हैं। – v010dya

+4

@ v010dya आप उन धारणाओं से बचने के लिए std :: bitset (या std :: bitset ) जैसे कुछ कर सकते हैं। – Conchylicultor

+0

मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि यह उत्तर प्रश्न का उत्तर नहीं दे रहा है। – Tkdestroyer2

संबंधित मुद्दे