2012-11-04 8 views
5

का जुटना द्विआधारी संख्या तो मैं 3 नंबर हैं। एक एक char है, और अन्य दो int16_t हैं (यह भी short रों रूप में जाना जाता है, लेकिन एक तालिका के अनुसार मैंने पाया शॉर्ट्स मज़बूती से 16 बिट नहीं होगा)।अलग-अलग लंबाई

मैं उन्हें एक साथ जोड़ करना चाहते हैं। तो कहना है कि उनमें से मूल्यों थे:

10010001

1111111111111101

1001011010110101

मैं एक long long युक्त साथ खत्म करना चाहते हैं:

1001000111111111111111011001011010110101000000000000000000000000

का उपयोग करना कुछ समाधान जो मैंने ऑनलाइन पाया है, मैं सी इसके साथ ame:

long long result; 
result = num1; 
result = (result << 8) | num2; 
result = (result << 24) | num3; 

लेकिन यह काम नहीं करता है; जब यह डीकोड किया जाता है तो यह मुझे बहुत विषम संख्या देता है।

मामले में मेरे डिकोडिंग कोड के साथ एक समस्या है, यहाँ यह है:

char num1 = num & 0xff; 
int16_t num2 = num << 8 & 0xffff; 
int16_t num3 = num << 24 & 0xffff; 

यहाँ क्या हो रहा है? मुझे संदेह है कि इसे long long के आकार के साथ करना है, लेकिन मैं इसके चारों ओर अपने सिर को लपेट नहीं सकता और मैं बाद में इसमें अधिक संख्या के लिए कमरा चाहता हूं।

उत्तर

6

के रूप में आप का अनुरोध किया सही बिट पैटर्न पाने के लिए आपको shoud का उपयोग करें:

:

result = num1; 
result = (result << 16) | num2; 
result = (result << 16) | num3; 
result<<=24; 

यह सटीक बिट पैटर्न है कि आप का अनुरोध किया, LSB के अंत में 24 बिट छोड़ दिया 0 निकलेगा

1001000111111111111111011001011010110101000000000000000000000000 
3

कि पिछले पारी के लिए, आप केवल 16 से स्थानांतरण किया जाना चाहिए, 24. 24 से नहीं अपने बाइनरी स्ट्रिंग की वर्तमान लंबाई, संख्या 1 और NUM2 के संयोजन के बाद है। आप num3 है, जो 16 बिट है के लिए जगह बनाने की जरूरत है, तो द्वारा 16.

संपादित करें छोड़ दिया बदलाव:

बस का एहसास पहले पारी भी गलत है। इसी तरह के कारणों के लिए यह भी 16 होना चाहिए।

1

हाँ आप कि लंबे समय में संग्रहित किया जा सकता मूल्य बह निकला रहे हैं। GMP जैसी बड़ी संख्या को स्टोर करने के लिए आप मनमाने ढंग से सटीक लाइब्रेरी का उपयोग कर सकते हैं।

+0

मैं उस पर ध्यान दूंगा, लेकिन मैं एक अलग दृष्टिकोण (बाएं के बजाए दाईं ओर संख्याओं को डालने) के बारे में सोच सकता हूं क्योंकि सादे संख्या सबसे तेज़ हैं। – Cheezey

+0

वह 'लंबे समय तक' का उपयोग कर रहा है, न कि 'लंबा'। 'लंबे समय तक' कम से कम 64 बिट्स स्टोर कर सकते हैं, उन्हें केवल 40 की जरूरत है। –

0

अगर मैं सही ढंग तुम क्या कर रहे समझते हैं, मैं का प्रयोग करेंगे:

result = num1; 
result = (result << 16) | num2; 
result = (result << 16) | num3; 

num1out = (result >> 32) & 0xff; 
num2out = (result >> 16) & 0xffff; 
num3out = result & 0xffff; 

निर्माण के दौरान बाईं पारी सम्मिलित करने के लिए अगले संख्या की चौड़ाई से है। निष्कर्षण पर सही बदलाव इमारत के दौरान क्षेत्र छोड़ा गया बिट्स की कुल संख्या से है।

मैं ऊपर कोड का परीक्षण किया है। जी ++ कंपाइलर के साथ इस कार्य के लिए काफी लंबा है, और मैं कई अन्य लोगों पर विश्वास करता हूं।

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