2010-10-16 10 views
18

जावा कोड की निम्न स्निप पर विचार चर बाइट के लिए आवेदन कियाव्यवहार

byte b=(byte) 0xf1; 
byte c=(byte)(b>>4); 
byte d=(byte) (b>>>4); 

उत्पादन:

c=0xff 
d=0xff 

उम्मीद उत्पादन:

c=0x0f 

कैसे? बी के रूप में बाइनरी 1111 0001 बिना हस्ताक्षरित दाएं शिफ्ट 0000 1111 के बाद 0x0f लेकिन यह 0xff क्यों है?

+3

शायद बाइट पहला संकेत int – CodesInChaos

उत्तर

32

समस्या यह है कि सभी तर्कों पहले int करने के लिए प्रोत्साहित कर रहे हैं इससे पहले कि पारी आपरेशन जगह लेता है:

byte b = (byte) 0xf1; 

b पर हस्ताक्षर किए है, इसलिए अपने मूल्य -15 है।

byte c = (byte) (b >> 4); 

b पहले प्रवेश बढ़ाया पूर्णांक -15 = 0xfffffff1 है, तो सही 0xffffffff और छोटा कर दिया करने के लिए 0xff के कलाकारों द्वारा byte में स्थानांतरित कर दिया है।

byte d = (byte) (b >>> 4); 

b पहले प्रवेश बढ़ाया पूर्णांक -15 = 0xfffffff1 है, तो सही 0x0fffffff और छोटा कर दिया करने के लिए 0xff के कलाकारों द्वारा byte में स्थानांतरित कर दिया है।

वांछित प्रभाव प्राप्त करने के लिए आप (b & 0xff) >>> 4 कर सकते हैं।

+12

तक बढ़ाया गया है ओह भगवान जावा इतना टूटा हुआ है - कौन गधे था जिसने कहा कि हस्ताक्षर किए गए अंकगणित प्रोग्रामर समझने के लिए बहुत जटिल थे? –

+1

@PP जावा में हस्ताक्षरित संख्याओं की अनुपस्थिति कोई समस्या नहीं है (पूर्णांक विभाजन को छोड़कर, और अंततः जेडीके 8 में तय किया जाएगा): http://stackoverflow.com/questions/397867/port-of-random- जनरेटर -से-सी-टू-जावा/397,997 # 397,997 – starblue

3

मुझे लगता है कि b स्थानांतरण को int पर स्थानांतरित करने से पहले बढ़ाया गया है।

(byte)((0x000000FF & b)>>4) 
1

अनुसार Bitwise and Bit Shift Operators लिए:

तो यह अपेक्षा के अनुरूप काम हो सकता है

अहस्ताक्षरित सही पारी ऑपरेटर ">>>" बदलाव वाम-पंथी की स्थिति में एक शून्य है, जबकि वाम-पंथी स्थिति ">>" के बाद साइन एक्सटेंशन पर निर्भर करता है।

तो b >> 4 साथ आप 1111 1111 करने के लिए 1111 0001 को बदलने (ख नकारात्मक है, तो यह 1 संलग्न कर देता है), जो 0xff है।

0

जावा दो अलग-अलग शिफ्ट ऑपरेटरों को परिभाषित करके बिना हस्ताक्षर किए गए मूल प्रकारों के स्पष्ट समर्थन के लिए skimp करने की कोशिश करता है।

प्रश्न हस्ताक्षरित सही शिफ्ट के बारे में बात करता है, लेकिन उदाहरण दोनों (हस्ताक्षरित और हस्ताक्षरित) दोनों हैं, और हस्ताक्षरित शिफ्ट (>>) के मूल्य को दिखाता है।

आपकी गणना हस्ताक्षरित शिफ्ट (>>>) के लिए सही होगी।

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

  • कोई संबंधित समस्या नहीं^_^