जावा में, क्या मैं द्विआधारी प्रारूप में एक पूर्णांक स्थिरांक को परिभाषित कर सकता हूं?


85

आप हेक्साडेसिमल या अष्टक में पूर्णांक स्थिरांक को कैसे परिभाषित कर सकते हैं, इसके समान, क्या मैं इसे बाइनरी में कर सकता हूं?

मैं मानता हूं कि यह वास्तव में आसान (और बेवकूफ) प्रश्न है। मेरी Google खोजें खाली आ रही हैं।


2
बस FYI करें, हर प्रोग्रामिंग भाषा में, मुहावरे में बाइनरी कॉन्स्टेंट लिखना है, न कि वास्तविक बाइनरी स्ट्रिंग।
13

3
सही है, लेकिन मुझे लगता है कि क्योंकि हेक्स निकटतम चीज़ उपलब्ध है, इसलिए नहीं कि बाइनरी में कुछ गड़बड़ है। मैंने जिन भाषाओं का उपयोग किया है, वे द्विआधारी शाब्दिक समर्थन करते हैं, मुझे नहीं लगता कि सम्मेलन इस सुविधा को अनदेखा करना है।
केन


वर्ष २०१ 2017: स्वीकृत जवाब जो कि रसेल द्वारा प्रदान किया जाना चाहिए। देखें: stackoverflow.com/a/1692932/716079
लौरेंको

जवाबों:


65

तो, जावा एसई 7 की रिलीज के साथ, बाइनरी नोटेशन बॉक्स से बाहर मानक है। यदि आप बाइनरी की एक अच्छी समझ रखते हैं, तो वाक्य रचना काफी सीधा और स्पष्ट है:

byte fourTimesThree = 0b1100;
byte data = 0b0000110011;
short number = 0b111111111111111; 
int overflow = 0b10101010101010101010101010101011;
long bow = 0b101010101010101010101010101010111L;

और विशेष रूप से वर्ग स्तर के चर को बायनेरिज़ घोषित करने के बिंदु पर, बाइनरी नोटेशन का उपयोग करके स्थिर चर को शुरू करने में कोई समस्या नहीं है:

public static final int thingy = 0b0101;

बस सावधान रहें कि बहुत अधिक डेटा वाले नंबरों को ओवरफ्लो न करें, वरना आपको एक कंपाइलर त्रुटि मिलेगी:

byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte

अब, यदि आप वास्तव में फैंसी प्राप्त करना चाहते हैं, तो आप जावा 7 में उस अन्य स्वच्छ नई सुविधा को जोड़ सकते हैं जिसे अंडरस्कोर के साथ संख्यात्मक शाब्दिक के रूप में जाना जाता है। शाब्दिक अंडरस्कोर के साथ बाइनरी नोटेशन के इन फैंसी उदाहरणों पर एक नज़र डालें:

int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011;
long bow = 0b1__01010101__01010101__01010101__01010111L;

अब यह अच्छा और साफ नहीं है, उच्च पठनीय का उल्लेख नहीं है?

मैंने TheServerSide पर विषय के बारे में लिखे एक छोटे से लेख से इन कोड स्निपेट को खींचा। अधिक जानकारी के लिए इसे आज़ाद करें:

जावा 7 और बाइनरी नोटेशन: OCP जावा प्रोग्रामर (OCPJP) परीक्षा में माहिर


3
आपका बाइट डेटा क्यों है = 0b0000110011; 10 बिट्स है? मैं प्रोग्रामिंग में नया हूं, लेकिन मुझे लगता है कि यह 8 बिट बाइट डेटा प्रकार को फिट करने के लिए 0b00110011 जैसा दिखता है।
माइक

1
किसी के लिए भी माइक की तरह ही सोच रहा था, यह इसलिए है क्योंकि संकलक इसे उस संख्या में परिवर्तित करता है जो इसका प्रतिनिधित्व करता है - आपके पास दसियों अग्रणी जीरो हो सकते हैं और वे वास्तविक मूल्य को प्रभावित नहीं करेंगे। संकलन प्रक्रिया अनिवार्य रूप से उसी तरह है जैसे आपने एक दशमलव लिखा था।
ल्यूक ब्रिग्स

1
परिभाषा के अनुसार आदिम प्रकार के बाइट 256 नंबर को -128 से 127 (-128 से -1 और 0 से 127) के बीच रख सकते हैं। लेकिन बाइनरी शाब्दिक का उपयोग करके -128 का प्रतिनिधित्व कैसे करें। उदाहरण के लिए बाइट b = -0b1111111; denotes -127 लेकिन क्या -128 के बारे में?
निर्मलसिंह

152

जावा 7 में:

int i = 0b10101010;

जावा के पुराने संस्करणों में कोई बाइनरी शाब्दिक नहीं हैं (विकल्पों के लिए अन्य उत्तर देखें)।


33
मैं यह भी _int i = 0b1010_1010_0011;
बताना चाहूंगा

@ रुस यहाँ 0 बी क्या दर्शाता है? इस सुविधा को जावा 7 में क्या कहा जाता है?
गीक

1
0 बी बाइनरी को दर्शाता है। इस सुविधा को द्विआधारी शाब्दिक कहा जाता है: docs.oracle.com/javase/7/docs/technotes/guides/language/…
Russ Hayward

1
बाइनरी डेटा के इस नए प्रतिनिधित्व से प्यार करें। स्ट्रिंग प्रतिनिधित्व को पढ़ना बहुत कठिन होगा। स्वीकृत उत्तर के अंतर और "@ user12345613" से एक को देखें। उसके लिए +1।
Marcello de Sales

54

जावा में कोई बाइनरी शाब्दिक नहीं हैं, लेकिन मुझे लगता है कि आप ऐसा कर सकते हैं (हालांकि मुझे यह बात दिखाई नहीं देती है):

int a = Integer.parseInt("10101010", 2);

1
अन्य उपयोगों के बीच, लाइन और बहुभुज रेखांकन के लिए स्टीपलिंग पैटर्न कई लोकप्रिय ग्राफिक्स लाइब्रेरी में पूर्णांक के रूप में निर्दिष्ट है। ParseInt या parseShort का उपयोग करके डेवलपर आसानी से पैटर्न की कल्पना कर सकता है।
charstar

5
जावा 7 के बाद से, रस हेवर्ड का जवाब सही उत्तर है। जावा 7 से पहले, आप पुराने जावा संस्करणों (ऑक्टल, दशमलव या हेक्साडेसिमल) द्वारा मान्यता प्राप्त अधिसूचनाओं में से एक को बाइनरी में बदलने के लिए एक ऑनलाइन टूल या अपने पसंदीदा कैलकुलेटर का उपयोग कर सकते हैं। यदि किसी अन्य मूलांक का उपयोग किया जाता है, तो द्विआधारी प्रतिनिधित्व वाली एक वर्णनात्मक टिप्पणी को पाठकों के लिए मूल्य स्पष्ट करने के लिए घोषणा में रखा जा सकता है।
जेसन सी

यह एक बल्कि गंदा समाधान है, है ना? आप सिर्फ 1 बाइट का प्रतिनिधित्व करने के लिए 16 बाइट्स ले रहे हैं (दूसरे तर्क और रूपांतरण की गिनती नहीं)। बेशक, जब तक कंपाइलर इसका अनुकूलन नहीं करता है, जो मुझे संदेह है।
टॉम ज़ातो -

@ TomášZato: हाँ, यह है, लेकिन आप क्या समाधान सुझाएंगे कि जब मैंने यह उत्तर लिखा तो भाषा ने द्विआधारी शब्द का समर्थन नहीं किया? Russ Hayward के पास अब स्वीकृत उत्तर होना चाहिए।
एड एस।

मेरा सुझाव है कि आराम देना और पूर्णांक का उपयोग करना। चर परिभाषा में, यह ठीक है, लेकिन यह उत्तर उपयोगकर्ताओं को लूप के लिए इस दृष्टिकोण का उपयोग करने के लिए प्रेरित कर सकता है, आदि और आम तौर पर, मुझे लगता है कि प्रोग्रामर को कुछ प्रदर्शन के लिए अपना खुद का आराम देने की कोशिश करनी चाहिए।
टॉम ज़ातो -

18

एड स्वांगरेन का जवाब

public final static long mask12 = 
  Long.parseLong("00000000000000000000100000000000", 2);

ठीक काम करता है। मैंने longइसके बजाय intउपयोग किया और थोड़ा सा मुखौटा के रूप में संभव उपयोग को स्पष्ट करने के लिए संशोधक को जोड़ा। हालांकि, इस दृष्टिकोण के साथ दो असुविधाएं हैं।

  1. उन सभी शून्य का सीधा टाइपिंग त्रुटि प्रवण है
  2. परिणाम विकास के समय दशमलव या हेक्स प्रारूप में उपलब्ध नहीं है

मैं वैकल्पिक दृष्टिकोण का सुझाव दे सकता हूं

public final static long mask12 = 1L << 12;

यह अभिव्यक्ति स्पष्ट करती है कि 12 वीं बिट 1 है (गिनती 0 से शुरू होती है, दाईं से बाईं ओर); और जब आप माउस कर्सर मँडराते हैं, टूलटिप

long YourClassName.mask12 = 4096 [0x1000]

ग्रहण में दिखाई देता है। आप अधिक जटिल स्थिरांक परिभाषित कर सकते हैं:

public final static long maskForSomething = mask12 | mask3 | mask0;

या स्पष्ट रूप से

public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0);

चर का मान maskForSomethingअभी भी विकास के समय ग्रहण में उपलब्ध होगा।


शानदार समाधान! (सार्वजनिक अंतिम स्थिर लंबा मास्क 12 = 1 एल << 12;)
ज्योरो 117

16

मास्किंग के लिए द्विआधारी स्थिरांक का उपयोग करना

स्थिरांक घोषित करें:

public static final int FLAG_A = 1 << 0;
public static final int FLAG_B = 1 << 1;
public static final int FLAG_C = 1 << 2;
public static final int FLAG_D = 1 << 3;

और उनका उपयोग करें

if( (value & ( FLAG_B | FLAG_D )) != 0){
    // value has set FLAG_B and FLAG_D
}

12

Google पर "जावा शाब्दिक वाक्य रचना" की खोज करें और आप कुछ प्रविष्टियों के साथ आते हैं।

एक ऑक्टल सिंटैक्स (0 के साथ आपका नंबर उपसर्ग है), "0x" उपसर्ग के साथ दशमलव सिंटैक्स और हेक्साडेसिमल सिंटैक्स। लेकिन बाइनरी नोटेशन के लिए कोई सिंटैक्स नहीं।

कुछ उदाहरण:

int i = 0xcafe ; // hexadecimal case
int j = 045 ;    // octal case
int l = 42 ;     // decimal case

1
इस सवाल का जवाब नहीं है।
माइकल मैकक्वाडे

वर्ष 2017: सौभाग्य से बाइनरी प्रतिनिधित्व के लिए अंकन है। यह "0 बी" से शुरू होता है। उदाहरण: byte b = 0b01000001(बेहतर तत्परता के लिए byte b = 0b0100_0001)।
लौरेंको

2

यदि आप बहुत सारे बाइनरी के साथ गड़बड़ करना चाहते हैं तो आप कुछ स्थिरांक को परिभाषित कर सकते हैं:

public static final int BIT_0 = 0x00000001;
public static final int BIT_1 = 0x00000002;

आदि।

या

public static final int B_00000001 = 0x00000001;
public static final int B_00000010 = 0x00000002;
public static final int B_00000100 = 0x00000004;

0

थोड़ा और अजीब जवाब:

public class Main {

    public static void main(String[] args) {
        byte b = Byte.parseByte("10", 2);
        Byte bb = new Byte(b);
        System.out.println("bb should be 2, value is \"" + bb.intValue() + "\"" );
    }

}

कौन सा आउटपुट [जावा] bb 2 होना चाहिए, मान "2" है

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