2009-09-19 10 views
8

के रूप में int32 के कम 32 बिट प्राप्त करना चाहता हूं मेरे पास एक Int64 मान है, लेकिन मुझे केवल 32 बिट्स की आवश्यकता है। इस प्रकार मैं Int64 मान के निचले 32 बिट्स से Int32 मान प्राप्त करने का एक त्वरित तरीका चाहता हूं।मैं int32

धन्यवाद

+4

यह कौन सी भाषा है? कृपया सही टैग –

+1

जोड़ें मुझे समझ में नहीं आता कि कोई भी भाषा जानने के बिना इस प्रश्न का उत्तर कैसे दे सकता है। – pseudocoder

उत्तर

5

क्या कुछ इस तरह:

long tempLong = ((yourLong >> 32) << 32); //shift it right then left 32 bits, which zeroes the lower half of the long 
int yourInt = (int)(yourLong - tempLong); 

यह यह करने के लिए सबसे कॉम्पैक्ट तरीका नहीं हो सकता है, लेकिन यह मेरे लिए सबसे पठनीय हो रहा है। निम्नलिखित कोड लंबा के उच्च आधा निकाल देंगे: यदि आप एक int32 मूल्य में एक int64 मूल्य असाइन करते हैं

long tempLong = (int)(yourLong >> 32); 
+7

इस पर निर्भर करता है कि संकलक अनुकूलन पर कितना अच्छा है, आपका पहला कोड नमूना केवल कास्टिंग से काफी धीमा हो सकता है। निजी तौर पर, मुझे यह विशेष रूप से स्पष्ट नहीं लगता है, या तो। –

+1

कम 32 बिट्स को शून्य करने के लिए, 'yourLong & 0xFFFFFFFF00000000' या' yourLong & (~ 0ULL << 32) 'का उपयोग करें, लेकिन कम बिट्स प्राप्त करने के लिए, केवल एक साधारण असाइनमेंट की आवश्यकता है क्योंकि शीर्ष हमेशा छोटा हो जाएगा, यह संकलक एक कास्ट 'yourInt = (int) yourLong' –

9

आप भाषा निर्दिष्ट नहीं किया है, लेकिन कई में, तुम सब करने की जरूरत है कोई Int32 के लिए यह डाली है। शीर्ष बिट्स को त्याग दिया जाएगा।

24

, संकलक स्वचालित रूप से उसके लिए आपको
(Steven Sudit के रूप में उल्लेख) करना होगा:

int64 val64 = ...; 
int32 val32 = ...; 
... 

val32 = val64; // get the low 32 bits 
// or 
val32 = (val64 >> 32); // get the high 32 bits 

और क्योंकि संकलक चेतावनी प्रदर्शित कर सकता है आप कलाकारों निर्दिष्ट कर सकते हैं

val32 = (int32)val64; 
1

आप कर सकते थे संकलक endian सत्ता संभाल, और सभी बिट स्थानांतरण, सूचक हेरफेर आदि

DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){ 
    ULARGE_INTEGER uli; 
    uli.QuadPart = in64; 
    return uli.LowPart; 
} 
+0

उपयोग को चेतावनी देता है आपके कोड के सामने 4 रिक्त स्थान जोड़ें ताकि यह ठीक से स्वरूपित हो। – DanM7

+0

या, अपने कोड के ब्लॉक का चयन करें और Ctrl-K दबाएं। – SiKing

+0

क्या आपका मतलब "ConvertUint64toUint32" था? – Quest

-1

C/C++ का सबसे अच्छा तरीका में (मेरी राय में) छिपाने देते हैं एक संघ का प्रयोग है। उदाहरण के लिए निम्न फ़ंक्शन 64 बिट पूर्णांक से निचले क्रम 32 बिट्स निकालने के लिए अज्ञात संघ का उपयोग करता है।

uint32_t lower_32_bits(uint64_t value) { 
    union { uint64_t value; struct { uint32_t high, low; }; } converter; 
    converter.value = value; 
    return converter.low; 
} 

यह संघ चाल चीजों के सभी प्रकार के लिए इस्तेमाल किया जा सकता है, एक ही bitlength, उदा के एक पूर्णांक में एक चल बिन्दु मूल्य के टुकड़े हो रही है की तरह bitwise संचालन और अन्य हैक्स करने के लिए।

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