अन्य उत्तर पहले से ही कहा गया है, (currentByte & 0x7F) | (currentByte & 0x80)
(currentByte & 0xFF)
के बराबर है।JLS3 15.22.1 कहना है कि यह करने के लिए प्रोत्साहित किया जाता है एक int
:
जब एक ऑपरेटर &, दोनों ऑपरेंड ^, या | परिवर्तनीय (§5.1.8) को एक आदिम अभिन्न प्रकार, बाइनरी संख्यात्मक पदोन्नति ऑपरेटरों (§5.6.2) पर पहली बार किया गया है। बिटवाई ऑपरेटर अभिव्यक्ति का प्रकार प्रचारित प्रकार के प्रचार प्रकार है।
क्योंकि JLS3 5.6.2 का कहना है कि टाइप करते currentByte
है byte
और 0x7F
एक int
है (और यह मामला है), तो दोनों ऑपरेंड int
करने के लिए प्रोत्साहित कर रहे हैं।
इसलिए, buffer
तत्व प्रकार int
या व्यापक का एक सरणी होगा।
अब, एक int
पर & 0xFF
प्रदर्शन करके, हम प्रभावी रूप से मूल byte
रेंज -128..127 अहस्ताक्षरित रेंज 0..255, अक्सर उदाहरण के लिए java.io
धाराओं द्वारा इस्तेमाल किया एक आपरेशन में मैप करें।
आप इसे निम्न कोड स्निपेट में कार्रवाई में देख सकते हैं। ध्यान दें कि यह समझने के लिए कि यहां क्या हो रहा है, आपको यह जानना होगा कि जावा char
को 2's complement मानों के अलावा, अभिन्न प्रकारों को संग्रहीत करता है।
byte b = -123;
int r = b;
System.out.println(r + "= " + Integer.toBinaryString(r));
int r2 = b & 0xFF;
System.out.println(r2 + "= " + Integer.toBinaryString(r2));
अंत में, एक वास्तविक दुनिया उदाहरण के लिए, जावाडोक और java.io.ByteArrayInputStream
की read
विधि के क्रियान्वयन की जाँच:
/**
* Reads the next byte of data from this input stream. The value
* byte is returned as an <code>int</code> in the range
* <code>0</code> to <code>255</code>. If no byte is available
* because the end of the stream has been reached, the value
* <code>-1</code> is returned.
*/
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
एलओएल, यही मुझे काम करना है! :) – Dave
दोनों एरे बाइट्स मैंने टिम्बो से सुझाव की कोशिश की, और इसके बदले में फ्यूबर किया गया: -/ – Dave
बफर तत्व प्रकार int या व्यापक है, अन्यथा इसे संकलित नहीं करना चाहिए। – eljenso