जावा में मूल्य और 0xff क्या करता है?


98

मेरे पास निम्नलिखित जावा कोड है:

byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;

जब प्रिंट किया जाता है तो परिणाम 254 होता है, लेकिन मुझे नहीं पता कि यह कोड कैसे काम करता है। यदि &ऑपरेटर बस साधा है, तो यह बाइट में परिणाम क्यों नहीं होता है और इसके बजाय एक पूर्णांक?


मैं ग्रहण को कोड कॉपी करता हूं। यह मुझे चेतावनी देता है "टाइप मिसमैच: इंट से बाइट में परिवर्तित नहीं हो सकता है"। क्या इसे int value = 0xfe में बदलना चाहिए;
बेन चेंग

1
@BenCheng होना चाहिएbyte value = (byte) 0xfe;
Bek

जवाबों:


171

यह result8 बिट्स valueको सबसे कम 8 बिट्स में डालने के परिणामस्वरूप (अहस्ताक्षरित) मान सेट करता है result

ऐसा कुछ होने का कारण यह है कि byteजावा में एक हस्ताक्षरित प्रकार है। अगर आपने अभी लिखा है:

int result = value;

तब के बजाय resultमूल्य के साथ समाप्त होगा । एक और सूक्ष्मता यह है कि केवल मूल्यों 1 पर काम करने के लिए परिभाषित किया गया है , तो क्या होता है:ff ff ff fe00 00 00 fe&int

  1. valueint( ff ff ff fe) में पदोन्नत किया जाता है ।
  2. 0xffएक intशाब्दिक है ( 00 00 00 ff)।
  3. के &लिए वांछित मान प्राप्त करने के लिए लागू किया जाता है result

(मुद्दा यह है कि रूपांतरण के लिए है intहोता है से पहले& ऑपरेटर लागू किया जाता है।)

1 ठीक है, काफी नहीं। &ऑपरेटर पर काम करता है longऔर साथ ही मूल्यों, यदि या तो संकार्य एक है long। पर नहीं byte। जावा भाषा विनिर्देश देखें, खंड 15.22.1 और 5.6.2


उस अंकन में x का क्या अर्थ है? x एक संख्या या एक हेक्स संख्या नहीं है?
18

3
@KazRodgers - 0x(या 0X) उपसर्ग जावा को बताता है कि पूर्णांक शाब्दिक का पालन हेक्स (आधार 16) के रूप में किया जाना चाहिए। जावा भी 0अष्टाक्षर शाब्दिक के लिए एक नंगे उपसर्ग का समर्थन करता है और 0b(या 0B) द्विआधारी शाब्दिक के लिए उपसर्ग। पूर्णांक शाब्दिक में अधिक जानकारी के लिए जावा भाषा विशिष्टता देखें ।
टेड होप

इस प्रकार शाब्दिक उदाहरण के लिए अगर मेरे पास 0x3fa था। 3fa वह हिस्सा है जिसे शाब्दिक संख्या में अनुवादित किया जा रहा है और 0x "यह एक हेक्स संख्या है" को नोट कर रहा है? @TedHopp?
कालट

1
@KazRodgers - बिल्कुल सही। ध्यान दें कि जावा में गैरकानूनी वाक्यविन्यास के बिना 0xया 0bखुद के द्वारा (बिना किसी अंक के)।
टेड होप

1
@DmitryMinkovsky - fe8-बिट में हेक्स बिट पैटर्न , दो का पूरक दशमलव मान .2 से मेल खाता है। मान को संरक्षित Integer.valueOf(byte)करने के लिए, उत्पादन करने की आवश्यकता होगी ff ff ff fe(-2 32-बिट में, दो के पूरक), नहीं 00 00 00 fe(दशमलव मान 254)। यह परिवर्तन (एक byteमान feसे एक intमान तक ff ff ff fe) साइन एक्सटेंशन के रूप में जाना जाता है और जावा भाषा विनिर्देश का हिस्सा है। इसका उद्देश्य value & 0xffसाइन एक्सटेंशन को पूर्ववत करना है (यानी, शून्य एक्सटेंशन का अनुकरण करने के लिए, कुछ जावा में नहीं है)।
टेड हॉप

57

से http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff

हेक्स शाब्दिक 0xFF एक समान इंट (255) है। जावा 32 बिट्स के रूप में int का प्रतिनिधित्व करता है। यह बाइनरी में इस तरह दिखता है:

00000000 00000000 00000000 11111111

जब आप थोड़ा बुद्धिमान और किसी भी संख्या पर इस मान (255) के साथ करते हैं, तो यह सभी (लेकिन शून्य के रूप में) संख्या के सबसे कम 8 बिट (मुखौटा बनाने के लिए जा रहा है)।

... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101

& कुछ% जैसा है लेकिन वास्तव में नहीं है

और 0xff क्यों? इस में (2 की शक्ति) - 1)। सभी (2 की शक्ति) - 1) (जैसे 7, 255 ...)% ऑपरेटर की तरह कुछ व्यवहार करेंगे।

तब
बाइनरी में, 0, सभी शून्य है, और 255 इस तरह दिखता है:

00000000 00000000 00000000 11111111

और -1 ऐसा दिखता है

11111111 11111111 11111111 11111111

जब आप 0xFF का बिट वाइज और 0 से 255 तक का कोई भी मूल्य करते हैं, तो परिणाम वही होता है जो मूल्य के समान होता है। और यदि कोई भी मूल्य 255 से अधिक है, तो भी परिणाम 0-255 के भीतर होगा।

हालांकि, यदि आप करते हैं:

-1 & 0xFF

आपको मिला

00000000 00000000 00000000 11111111, जो -1 के मूल मान के बराबर नहीं है ( 11111111दशमलव में 255 है)।


कुछ और अधिक हेरफेर: (सवाल से संबंधित नहीं)

X >> 1 = X/2
X << 1 = 2X

जाँच करें कि कोई विशेष बिट सेट है (1) या नहीं (0) तब

 int thirdBitTobeChecked =   1 << 2   (...0000100)
 int onWhichThisHasTobeTested = 5     (.......101)

 int isBitSet = onWhichThisHasTobeTested  & thirdBitTobeChecked;
 if(isBitSet > 0) {
  //Third Bit is set to 1 
 } 

सेट (1) एक विशेष बिट

 int thirdBitTobeSet =   1 << 2    (...0000100)
 int onWhichThisHasTobeSet = 2     (.......010)
 onWhichThisHasTobeSet |= thirdBitTobeSet;

रीसेट (0) एक विशेष बिट

int thirdBitTobeReSet =   ~(1 << 2)  ; //(...1111011)
int onWhichThisHasTobeReSet = 6      ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;

XOR

बस ध्यान दें कि यदि आप दो बार XOR ऑपरेशन करते हैं, तो समान मूल्य होगा।

byte toBeEncrypted = 0010 0110
byte salt          = 0100 1011

byte encryptedVal  =  toBeEncrypted ^ salt == 0110 1101
byte decryptedVal  =  encryptedVal  ^ salt == 0010 0110 == toBeEncrypted :)

XOR के साथ एक और तर्क है

if     A (XOR) B == C (salt)
then   C (XOR) B == A
       C (XOR) A == B

ऊपर नीचे की तरह अस्थायी बिना दो चर स्वैप करने के लिए उपयोगी है

a = a ^ b; b = a ^ b; a = a ^ b;

या

a ^= b ^= a ^= b;

इसके अलावा नज़र @ बिट हेरफेर है stackoverflow.com/questions/13422259/...
Kanagavelu Sugumar


4

यह बहुत सारे कोड कम करने में मदद करता है। यह कभी-कभी आरजीबी मूल्यों में उपयोग किया जाता है जिसमें 8 बिट्स होते हैं।

जहाँ 0xff का अर्थ 24 (0) और 8 (1) है जैसे00000000 00000000 00000000 11111111

यह प्रभावी रूप से वैरिएबल को मास्क करता है इसलिए यह अंतिम 8 बिट्स में केवल मान छोड़ता है, और बाकी सभी बिट्स को अनदेखा करता है

यह ऐसे मामलों में सबसे अधिक देखा जाता है जब रंग मानों को एक विशेष प्रारूप से मानक आरजीबी मूल्यों (जो 8 बिट लंबा है) में बदलने की कोशिश कर रहा है।

ग्रेट स्पष्टीकरण यहाँ देखें


0

32 बिट प्रारूप प्रणाली में हेक्साडेसिमल मान 0xffका प्रतिनिधित्व करता है 00000000000000000000000011111111वह यह है कि 255(15*16^1+15*16^0)दशमलव में। और बिटवाइज़र और ऑपरेटर पहले ऑपरेंड की तरह ही 8 सबसे सही बिट्स मास्क करते हैं।


क्या आप कुछ और समझा सकते हैं।
ashishdhiman2007
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.