हालांकि बहुत देर हो चुकी है, मैं इस पर अपना इनपुट देना चाहूंगा क्योंकि यह स्पष्ट कर सकता है कि जेबी निज़ेट द्वारा दिया गया समाधान क्यों काम करता है। मैं बाइट पार्सर पर काम करने वाली इस छोटी सी समस्या और खुद को बदलने के लिए लड़खड़ा गया। जब आप बड़े आकार के अभिन्न प्रकार से छोटे आकार के अभिन्न प्रकार से कॉपी करते हैं क्योंकि यह जावा डॉक्टर कहता है:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3.3
एक इंटीग्रल टाइप टी पर हस्ताक्षर किए गए पूर्णांक का एक संकीर्ण रूपांतरण टी केवल सभी को छोड़ देता है लेकिन n निम्नतम ऑर्डर बिट्स, जहां n टाइप टी का प्रतिनिधित्व करने के लिए उपयोग की जाने वाली बिट्स की संख्या है। संख्यात्मक मान की परिमाण के बारे में जानकारी के संभावित नुकसान के अलावा, इससे इनपुट मूल्य के संकेत से भिन्न होने के परिणामस्वरूप परिणाम का संकेत हो सकता है। ।
आप यह सुनिश्चित कर सकते हैं कि एक बाइट एक अभिन्न प्रकार है क्योंकि यह जावा डॉक https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
बाइट कहता है
: बाइट डेटा प्रकार 8-बिट पर हस्ताक्षरित दो का है पूर्णांक पूरक।
तो एक पूर्णांक (32 बिट्स) को बाइट (8 बिट्स) में डालने के मामले में, आप बस उस पूर्णांक के अंतिम (कम से कम 8 बिट्स) को दिए गए बाइट वेरिएबल को कॉपी करते हैं।
int a = 128;
byte b = (byte)a; // Last 8 bits gets copied
System.out.println(b); // -128
कहानी के दूसरे भाग में शामिल है कि जावा यूनरी और बाइनरी ऑपरेटर ऑपरेशंस को कैसे बढ़ावा देते हैं।
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2.2
या तो या दोनों ऑपरेंड को निर्दिष्ट करने के लिए रूपांतरित करने के लिए आदिम रूपांतरण (.15.1.2) को लागू किया जाता है निम्नलिखित नियमों द्वारा:
यदि या तो ऑपरेंड डबल का है, तो दूसरा डबल में बदल जाता है।
अन्यथा, यदि ऑपरेंड या तो फ्लोट का है, तो दूसरा फ्लोट में बदल जाता है।
अन्यथा, यदि या तो ऑपरेंड प्रकार का लंबा है, तो दूसरा लंबे में परिवर्तित हो जाता है।
अन्यथा, दोनों ऑपरेंड को int टाइप करने के लिए कनवर्ट किया जाता है।
निश्चिंत रहें, यदि आप अभिन्न प्रकार के साथ काम कर रहे हैं int और / या कम यह int को बढ़ावा दिया जाएगा।
// byte b(0x80) gets promoted to int (0xFF80) by the & operator and then
// 0xFF80 & 0xFF (0xFF translates to 0x00FF) bitwise operation yields
// 0x0080
a = b & 0xFF;
System.out.println(a); // 128
मैंने अपना सिर भी इधर उधर कर दिया :)। Rgettman द्वारा यहाँ इसके लिए एक अच्छा जवाब है।
जावा में बिटवाइज ऑपरेटर्स केवल पूर्णांक और लंबे समय के लिए?