11010100 << 1 बराबर 110101000, 10101000 क्यों नहीं?


40

जब मैं 11010100 2 के लिए बिट्स को स्थानांतरित करने की कोशिश करता हूं , तो परिणाम 110101000 2 है , न कि 10101000 2

int a = Integer.parseInt("11010100", 2) << 1;

मैं यह करने की कोशिश करता हूं:

int a = (byte)(Integer.parseInt("11010100", 2) << 1);

लेकिन अगर आउटपुट वैल्यू 128 से अधिक है, तो सब कुछ माइनस में चला जाता है, जो तार्किक है। मैं उस बिट की संख्या कैसे नहीं बदल सकता हूं?


4
पूर्णांक अंकगणित हमेशा ints या longs पर किया जाता है ।
टॉम हॉल्टिन -

34
आप पूर्णांक का उपयोग कर रहे हैं, वे 32 बिट लंबे हैं। आप परिणाम को 8 बिट्स से काटे जाने की उम्मीद क्यों करेंगे?
jhamon

1
बाइट ए = ... इसे ठीक कर देंगे।
पेर्डी एस्टाक्वेल

जवाबों:


61

चलो एक बार में एक कदम उठाते हैं।

  1. Integer.parseInt("11010100", 2)- यह int मान 212 है। यह, वैसे, अनावश्यक है; तुम सिर्फ लिख सकते हैं: 0b11010100

  2. 0b11010100 << 1के रूप में ही है 0b110101000, और 424 है।

  3. फिर आप इसे एक बाइट में डालते हैं (byte)(0b11010100 << 1):। पहले 8 से परे बिट्स सभी को काट दिया जाता है, जो 0b10101000 छोड़ देता है, जो -88 है। माइनस, हाँ, क्योंकि जावा बाइट्स में हस्ताक्षर किए जाते हैं।

  4. आप फिर चुपचाप इस -88 को इंट में वापस डाल देते हैं, जैसा कि आप इसे एक इंट वैल्यू पर असाइन करते हैं। यह रहता है -88, जिसका अर्थ है कि सभी शीर्ष बिट्स सभी 1s हैं।

इसलिए, अंतिम मूल्य है -88

यदि आप 168इसके बजाय देखना चाहते हैं (जो सटीक समान बिट्स है, लेकिन हस्ताक्षरित के बजाय अहस्ताक्षरित दिखाया गया है), सामान्य चाल का उपयोग करना है & 0xFF, जो पहले 8 से 0 को छोड़कर सभी बिट्स सेट करता है, इस प्रकार एक सकारात्मक संख्या की गारंटी देता है:

byte b = (byte) (0b11010100 << 1);
System.out.println(b); // -88. It is not possible to print 168 when printing a byte.
int asUnsigned = b & 0xFF;
System.out.println(asUnsigned); // 168.

// or in one go:

System.out.println(((byte) (0b11010100 << 1)) & 0xFF); // 168

19
वह मान को संग्रहीत कर रहा है int a, इसलिए यदि आपके पास है & 0xFF, तो आपको बिलकुल डालने की आवश्यकता नहीं है। int a = (0b11010100<< 1) & 0xFF;
मूकिंग डक

9

यदि आप नीचे के 8 बिट्स से 0 बिट्स को सेट करना चाहते हैं, तो आप बिट-वार और:

int a = (Integer.parseInt("11010100", 2) << 1) & 0xff;
System.out.println (Integer.toString(a,2));

आउटपुट:

10101000

6

कुछ इस तरह की कोशिश करो:

int anInt = Integer.parseInt("11010100", 2) << 1;
int asUnsignedInt= Byte.toUnsignedInt((byte) anInt);

toUnsignedInt को Java SE 8 में पेश किया गया है।

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