2013-04-04 7 views
6

मुझे लगता है मैं थोड़ा endian में एक bytearray (सामग्री []) है और एक 2 बाइट मूल्य से बनाना होगा कोडजावा बिटवाइज़ आपरेशन

int b1 = 0xffff & (content[12]<<8 | 0xff & content[11]); 

की इस पंक्ति है। यह कोड नौकरी ठीक है लेकिन परीक्षण से पहले मैंने इसे

int b1 = 0xffff & (content[12]<<8 | content[11]); 

और परिणाम सही नहीं था। मेरा सवाल यह है कि इस परिदृश्य में 0xff क्यों आवश्यक है?

+0

क्योंकि बाइट्स को हस्ताक्षरित पूर्णांक के रूप में व्याख्या किया जाता है, और इसका मतलब है, उदाहरण के लिए, (बाइट) 0x80 (int) 0xffffff80 हो जाता है। इसे साइन एक्सटेंशन कहा जाता है। उत्तर के लिए – Ingo

उत्तर

12

0xff दो प्रमुख कारकों के संगम की वजह से आवश्यक है:

  1. जावा के सभी पूर्णांक प्रकार कार्रवाई करने से पहले
  2. प्रवेश किया हुआ है सभी बिटवाइज़ ऑपरेटर्स (या long यदि आवश्यक हो) int को उनके तर्कों को बढ़ावा देने के।

नतीजा यह है कि अगर content[11] के उच्च आदेश बिट स्थापित किया गया था, यह एक नकारात्मक हो int मूल्य में साइन-बढ़ाया जाएगा। आपको & पर 0xff के साथ इसे एक (सकारात्मक) बाइट मान पर वापस करने की आवश्यकता है। अन्यथा जब आप |content[12]<<8 के परिणाम के साथ, उच्च-आदेश बाइट सभी 1s होगा।

+0

Thx! मुझे अनुमानित सामग्री नहीं होगी [11] उच्च-आदेश बिट सेट के साथ int में डाला जाएगा। मैंने सोचा कि जब मैं दो मानों को जोड़ता हूं या उन्हें बिट स्तर पर एएसआरई का उपयोग किया जाएगा। चीयर्स – John

+1

@ जॉन यदि आप इस उत्तर से खुश हैं (और आप ऐसा प्रतीत होते हैं), तो कृपया इसे स्वीकार करें (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- काम)। –

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