2011-04-07 14 views
8

gcc 4.4 ऐसा लगता है जब उन्होंने int128_t जोड़ा और मुझे बिट स्थानांतरण का उपयोग करने की आवश्यकता है और मैंने कुछ छोटे क्षेत्रों के लिए कमरे से बाहर भाग लिया है।क्या जीसीसी पर 128 बिट इन्ट्स करने का कोई तरीका है <4.4

संपादित करें: ऐसा इसलिए हो सकता है क्योंकि मैं 32-बिट कंप्यूटर पर हूं, 32-बिट कंप्यूटर (इंटेल एटम) के लिए इसका कोई तरीका नहीं है? मुझे कोई परवाह नहीं होगा अगर यह मुश्किल धीमी मशीन कोड उत्पन्न करता है अगर मैं बिट स्थानांतरण के साथ अपेक्षा करता हूं।

उत्तर

1

आप दो 64-बिट चींटियों का उपयोग कर सकते हैं, लेकिन फिर आपको बीच में चलने वाली बिट्स का ट्रैक रखने की आवश्यकता है।

8

मुझे पूरा यकीन है कि __int128_t जीसीसी के पुराने संस्करणों पर उपलब्ध है। बस 4.2.1 और फ्रीबीएसडी और sizeof(__int128_t) पर जांच की गई है 16.

+0

यह (जैसे के रूप में RHEL 5 में) पहले जीसीसी 4.1.2 के साथ काम नहीं लगता है –

4

आप लाइब्रेरी का भी उपयोग कर सकते हैं। इसका लाभ यह होगा कि यह पोर्टेबल (प्लेटफ़ॉर्म और कंपाइलर के संबंध में) है और आप आसानी से भी बड़े डेटाटाइप पर स्विच कर सकते हैं। एक मैं जीएमपी की सिफारिश कर सकता हूं (भले ही इसका इरादा बिटविड्थ एक्स को संभालना न पड़े, लेकिन जितना बड़ा हो उतना वैरिएबल)।

2

बिट स्थानांतरण किसी भी मनमानी संख्या में बिट्स में बहुत आसान है। बस अगले अंग में अतिप्रवाह बिट्स को स्थानांतरित करना याद रखें। यही कारण है कि बदलाव के लिए सभी

typedef struct { 
    int64_t high; 
    uint64_t low; 
} int128_t; 


int128_t shift_left(int128_t v, unsigned shiftcount) 
{ 
    int128_t result; 
    result.high = (v.high << shiftcount) | (v.low >> (64 - shiftcount)); 
    result.low = v.low << shiftcount; 
    return result; 
} 

इसी प्रकार के सही

int128_t shift_right(int128_t v, unsigned shiftcount) 
{ 
    int128_t result; 
    result.low = (v.low >> shiftcount) | (v.high << (64 - shiftcount)); 
    result.high = v.high >> shiftcount; 
    return result; 
}