2011-02-16 10 views
22

मैं कम से कम 32 बिट्स को कई प्रकार से प्राप्त करना चाहता हूं, इसलिए मैं बिट्स मास्क 0xFFFFFFFF के साथ संख्या पर बिटवाई ऑपरेशन "&" निष्पादित करता हूं, लेकिन परिणाम सही नहीं है, इसमें अभी भी अन्य बिट्स शामिल हैं।बिटवाई "और" लंबे समय तक?

उदाहरण के लिए

:

long a = 0x1234567890ab; 
long b = (a & 0xffffffff); 

मैं ख के मूल्य की उम्मीद 0x567890ab

लेकिन व्यवहार में हो सकता है, यह अभी भी 0x1234567890ab

+0

एक सी programer के रूप में (25+ वर्ष) 0xffffffffffffffff मैं अहस्ताक्षरित चर का उपयोग करने के लिए संकेत विस्तार से बचने के लिए इस्तेमाल किया कर रहा हूँ मुद्दे लेकिन इस मामले में मुझे अपने कड़वाहट के अंत में एल जोड़ने के लिए सोचना चाहिए था। मैं जावा सीख रहा हूं और शायद मैं कुछ अन्य नुकसान में पड़ जाऊंगा: ओ) –

+1

बहुत अच्छा सवाल है। मैं बस इस पर आया और जवाब काफी आश्चर्यचकित था। क्या यह जावा पज़लर से गायब है? :) –

उत्तर

44

है इस प्रयास करें:

long a = 0x1234567890ab; 
long b = (a & 0xffffffffL); 

0xffffffff performi के लिए int का एक शाब्दिक प्रकार है &long के साथ इसे longsign extension द्वारा प्रचारित करने के लिए प्रचारित किया गया है, इसलिए यह 0xffffffffffffffff में बदल जाता है। साइन एक्सटेंशन से बचने के लिए आपको इसे long: 0xffffffffL के शाब्दिक प्रकार के रूप में लिखना होगा।

+0

मैंने सवाल पोस्ट करने के ठीक बाद इसे समझ लिया: ओ) वैसे भी धन्यवाद। –

+2

यह उत्तर, और मूल प्रश्न, ने मुझे ग्रहण डीबगर के साथ लंबे समय तक बिताते हुए बचाया! स्पष्टीकरण और _sign-extension_ के बारे में लिंक के लिए धन्यवाद। – Axel

0

थोड़ा सा करने की कोशिश करें और 32 बिट मान के बजाय कुछ प्रमुख शून्यों के साथ एक लंबे मूल्य के साथ। अभी आप मूल रूप से संख्या के लिए कुछ भी नहीं कर रहे हैं।

3

0xffffffffL का उपयोग करके कोई फर्क पड़ता है?

मुझे लगता है कि क्या होता है यह है कि 0xffffffff लंबे समय तक उभरा होता है, और चूंकि दोनों int और long हस्ताक्षरित हैं, यह एक ही संकेत रखने की कोशिश करता है।

तो, के बाद से 0xffffffff है -1 एक पूर्णांक के रूप में, यह करने के लिए -1 एक लंबे समय के रूप में परिवर्तित हो जाती है, या

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