2009-07-30 8 views
8

में दो यूंट्स को उलंग में जोड़ने का सबसे अच्छा तरीका क्या है, दो यूंट्स को सी # में उलझाने के लिए सबसे अच्छा तरीका क्या है, उच्च/निम्न संकेतों को सेट करना।सी #

मुझे पता है कि बिट्सफिफ्टिंग यह कर सकती है, लेकिन मुझे सिंटैक्स नहीं पता है, या शायद अन्य एपीआई बिटकॉन्टर की तरह मदद करने के लिए नहीं हैं, लेकिन मुझे ऐसा कोई तरीका नहीं दिख रहा है जो मैं चाहता हूं।

उत्तर

18
ulong mixed = (ulong)high << 32 | low; 

कास्ट बहुत महत्वपूर्ण है। यदि आप कास्ट छोड़ देते हैं, तो इस तथ्य पर विचार करते हुए कि highuint (जो 32 बिट्स है) है, तो आप बाईं ओर 32 बिट मान 32 बिट्स को स्थानांतरित कर देंगे। 32 बिट चर पर ऑपरेटरों शिफ्ट छोड़ दिया करने के लिए एक uint 32 बिट स्थानांतरण right-hand-side आधुनिक 32. प्रभावी ढंग से, द्वारा पारी सामान का उपयोग करेगा नो-सेशन है। ulong पर कास्टिंग इसे रोकता है।

इस तथ्य को सत्यापित किया जा रहा आसान है:

uint test = 1u; 
Console.WriteLine(test << 32); // prints 1 
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1 
+0

जिज्ञासा से बाहर, कलाकारों की आवश्यकता क्यों है? – LiraNuna

+0

यदि उच्च केवल एक int है, तो उच्च << 32 सभी शून्य होंगे, क्योंकि आपने बस सभी को चर के बाहर पूरी तरह से स्थानांतरित कर दिया है। इससे पहले कि आप इसे स्थानांतरित करना शुरू करें, आपको इसे 64-बिट पूर्णांक * की आवश्यकता है। –

+0

अरिक: "आपने बस सभी को चर के बाहर पूरी तरह से स्थानांतरित कर दिया" यह पूरी तरह से सच नहीं है। मेरा अद्यतन उत्तर पढ़ें। –

2
ulong output = (ulong)highUInt << 32 + lowUInt 

बाईं (उच्च) और सही (कम) के लिए << और >> ऑपरेटरों bitshift, क्रमशः। highUInt << 32 कार्यात्मक रूप से highUInt * Math.Pow(2, 32) जैसा ही है, लेकिन यह तेज़ हो सकता है और (आईएमओ) सरल वाक्यविन्यास है।

+0

यह गलत है। 'hiInt << 32 == highInt' अगर' highInt' एक 'uint' है। –

+0

धन्यवाद, कलाकार जोड़ा गया। –

1

आप एक ULONG को highInt कन्वर्ट करने के लिए इससे पहले कि आप bitshift है:

ulong output = highInt; 
output = output << 32; 
output += lowInt; 
1

एन्कोडिंग:

ulong mixed = (ulong)hi << 32 | lo; 

डिकोडिंग:

uint lo = (uint)(mixed & uint.MaxValue); 
uint hi = (uint)(mixed >> 32);