2008-09-29 10 views
5

मान लीजिए कि मेरे पास एक लंबा लंबा int है और इसके बिट्स लेना चाहते हैं और इसमें से चार हस्ताक्षरित छोटी चींटियां बनाना चाहते हैं।एक लंबे लंबे int से चार हस्ताक्षरित छोटी चींटियों को निकालने के लिए कैसे?

विशेष आदेश यहां कोई फर्क नहीं पड़ता।

मुझे आम तौर पर पता है कि मुझे बिट्स को स्थानांतरित करने और बिना हस्ताक्षरित लघु int के आकार में छंटनी की आवश्यकता है। लेकिन मुझे लगता है कि मैं कहीं कुछ अजीब गलती कर सकता हूं, इसलिए मैं पूछता हूं।

उत्तर

11
#include <stdint.h> 
#include <stdio.h> 

union ui64 { 
    uint64_t one; 
    uint16_t four[4]; 
}; 

int 
main() 
{ 
    union ui64 number = {0x123456789abcdef0}; 
    printf("%x %x %x %x\n", number.four[0], number.four[1], 
          number.four[2], number.four[3]); 
    return 0; 
} 
+0

क्या यह छोटे/बड़े-एंडियन से प्रभावित होगा? – slashmais

+0

हां, आपको छोटे-एंडियन सिस्टम बनाम छोटे-एंडियन वाले लोगों के लिए अलग-अलग परिणाम मिलते हैं। –

+0

यह निश्चित रूप से एक त्वरित और हैकी समाधान है, जैसा कि: "@numbers = unpack 'S4', पैक 'क्यू', $ संख्या;" पर्ल –

2
union LongLongIntToThreeUnsignedShorts { 
    long long int long_long_int; 
    unsigned short int short_ints[sizeof(long long int)/sizeof(short int)]; 
}; 

कि क्या तुम गड़बड़ करने के लिए थोड़ा और स्थानांतरण के साथ चारों ओर बिना बारे में सोच रहे करना चाहिए।

+0

क्या आप गारंटी दे सकते हैं कि संरचना में छोटी चींटियों के बीच पैडिंग नहीं होगी? – Alexander

+0

अच्छा बिंदु। ऐरे विधि अधिक समझदार होगी। – workmad3

+0

ओउप्स - मैंने मूल रूप से लगभग तीन हस्ताक्षरित इंट्स लिखे थे। यह शायद आपको गुमराह करता है। उसके लिए खेद है। आपका जवाब वैसे भी मददगार था। –

3
(unsigned short)((((unsigned long long int)value)>>(x))&(0xFFFF)) 

जहां value अपने long long int है, और x 0, 16, 32 या 48 चार शॉर्ट्स के लिए है।

+0

बिट्सफिफ्टिंग के साथ पकड़ यह है कि सी/सी ++ में व्यवहार नकारात्मक संख्याओं के लिए अपरिभाषित है। – Alexander

+0

नकारात्मक "मान" के लिए यह अपरिभाषित नहीं है, यह कार्यान्वयन-परिभाषित है। नकारात्मक "एक्स" के लिए यह अनिर्धारित है, लेकिन यह कभी नहीं होता है। और एक नकारात्मक पूर्णांक का भंडारण प्रारूप क्रियान्वयन-परिभाषित भी है (कुछ संभावनाओं के भीतर), इसलिए उस स्कोर पर यह संघ का उपयोग करने से भी बदतर नहीं है। –

+0

मुझे कोई परवाह नहीं है कि शिफ्ट साइन-मूल्य मूल्य बढ़ाता है, मैं नीचे सोलह बिट्स के अलावा सभी को मास्क कर रहा हूं। वे अच्छी तरह से परिभाषित हैं। – moonshadow

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