क्या जावास्क्रिप्ट में बाइनरी नंबर का प्रतिनिधित्व करने के लिए "0b" या कुछ समान है


130

मुझे पता है कि 0xजावास्क्रिप्ट में हेक्साडेसिमल संख्याओं के लिए एक उपसर्ग है। उदाहरण के लिए, 0xFFसंख्या 255 के लिए खड़ा है।

क्या बाइनरी नंबर के लिए भी कुछ ऐसा ही है? मैं 0b1111संख्या का प्रतिनिधित्व करने की उम्मीद करूंगा 15, लेकिन यह मेरे लिए काम नहीं करता है।


1
जिज्ञासा से बाहर: आपको जावास्क्रिप्ट में द्विआधारी शाब्दिक की आवश्यकता क्यों होगी? जावास्क्रिप्ट की उच्च-स्तरीय प्रकृति का मतलब है कि आमतौर पर निम्न-स्तरीय निर्माणों के साथ बातचीत करने की आवश्यकता नहीं होती है जो कि द्विआधारी लीटर की आवश्यकता होती है।
जोआचिम सॉर

19
क्योंकि इस तरह से कोड अधिक पठनीय होगा। मेरा कार्यान्वयन कुछ विशिष्टता पर आधारित है जो बाइनरी संख्याओं का उपयोग करता है।
मीशा मोरोस्को

5
रोबोटिक्स के लिए नोड जेएस का उपयोग करना एक अच्छा उदाहरण है जहां बाइनरी की आवश्यकता हो सकती है
ग्रेग वुड्स

बेहतर पठनीयता के लिए आप संख्यात्मक विभाजकों का उपयोग करने पर विचार कर सकते हैं । 0b0111_0_1_0_1
Константин Ван

जवाबों:


181

अपडेट करें:

जावास्क्रिप्ट के नए संस्करणों - विशेष रूप से ECMAScript 6 - में बाइनरी (उपसर्ग 0b), ऑक्टल (उपसर्ग 0o) और हेक्साडेसिमल (उपसर्ग 0x:) संख्यात्मक शाब्दिकों के लिए समर्थन जोड़ा गया है:

var bin = 0b1111;    // bin will be set to 15
var oct = 0o17;      // oct will be set to 15
var oxx = 017;       // oxx will be set to 15
var hex = 0xF;       // hex will be set to 15
// note: bB oO xX are all valid

यह सुविधा फ़ायरफ़ॉक्स और क्रोम में पहले से ही उपलब्ध है। यह वर्तमान में IE में समर्थित नहीं है, लेकिन जाहिरा तौर पर स्पार्टन आने पर होगा।

( सेमीकॉलन की टिप्पणी के लिए धन्यवाद और इसे इंगित करने के लिए उरिश के उत्तर पर ।)

मूल उत्तर:

नहीं, बाइनरी नंबर के लिए कोई समकक्ष नहीं है। जावास्क्रिप्ट केवल दशमलव (कोई उपसर्ग), हेक्साडेसिमल (उपसर्ग 0x) और अष्टक (उपसर्ग 0) स्वरूपों में संख्यात्मक शाब्दिक का समर्थन करता है।

एक संभावित विकल्प parseIntमूलांक के साथ विधि के लिए एक बाइनरी स्ट्रिंग पास करना है :

var foo = parseInt('1111', 2);    // foo will be set to 15

2
@MishaMoroshko मैं सहमत हूँ, लेकिन कुछ भाषाओं का 0bसमर्थन है।
अल्बा मेंडेज़

5
तकनीकी रूप से, जावास्क्रिप्ट में ऑक्टल नोटेशन की सुविधा नहीं है, हालाँकि अधिकांश (सभी?) ब्राउज़र इसका समर्थन करते हैं। यह स्पष्ट रूप से सख्त मोड में अस्वीकृत है।
डेबस्टर

5
ध्यान दें कि आंतरिक रूप से जावास्क्रिप्ट में, प्रत्येक संख्या 64 बिट फ्लोट है, पूर्णांक जैसी कोई चीज नहीं है। इस प्रकार बड़ी संख्या के साथ, आप सटीकता को ढीला करते हैं। सबसे बड़ा सटीक "पूर्णांक" 2 ^ 53 या 9007199254740992 है।
Župa

5
पूर्णांक हैं, क्योंकि पूर्णांक एक गणित शब्द है, कोई नहीं है int typeऔर न ही है integer type, इसलिए सभी पूर्णांकों को फ़्लोट्स के रूप में संग्रहीत किया जाता है।
पर्किन्स

3
यह उत्तर उस समय सत्य था, लेकिन यह एक अद्यतन का उपयोग कर सकता था। जैसा कि नीचे दिए गए अपने उत्तर में यूरिश बताते हैं, बाइनरी और ऑक्टल नंबरों के लिए शाब्दिक शब्द (ओक्टल्स अब "0o1" लिखे गए हैं) ईएस 6 में हैं। वे पहले ही फ़ायरफ़ॉक्स, क्रोम और यहां तक ​​कि नए IE (स्पार्टन) के पूर्वावलोकन में उतर चुके हैं।
सेमीकॉलन

29

ECMASCript 6 में यह भाषा के एक भाग के रूप में समर्थित होगा, अर्थात 0b1111 === 15यह सत्य है। आप एक अपरकेस बी (जैसे 0B1111) का भी उपयोग कर सकते हैं ।

ढूंढें NumericLiterals में ES6 युक्ति


23

मुझे पता है कि लोग कहते हैं कि प्रोटोटाइप का विस्तार एक अच्छा विचार नहीं है, लेकिन आपकी स्क्रिप्ट है ...

मैं इसे इस तरह से करता हूं:

Object.defineProperty(Number.prototype, 'b', {set:function(){return false;},get:function(){return parseInt(this, 2);}});

100..b       // returns 4
11111111..b  // returns 511
10..b+1      // returns 3

// and so on

3
यह अच्छा है! 8-) ध्यान दें कि ParseInt("101", 2)वास्तविक उत्तर हो सकता है!
एलेक्सिस विल्के

20

यदि आपकी प्राथमिक चिंता कोडिंग के बजाय प्रदर्शित होती है, तो एक अंतर्निहित रूपांतरण प्रणाली है जिसका आप उपयोग कर सकते हैं:

var num = 255;
document.writeln(num.toString(16)); // Outputs: "ff"
document.writeln(num.toString(8)); // Outputs: "377"
document.writeln(num.toString(2)); // Outputs: "11111111"

संदर्भ: जावास्क्रिप्ट संख्या संदर्भ


11

जहां तक ​​मुझे पता है कि जावास्क्रिप्ट में बाइनरी डिनोटर का उपयोग करना संभव नहीं है। मेरे पास आपके लिए तीन समाधान हैं, जिनमें से सभी में उनके मुद्दे हैं। मुझे लगता है कि विकल्प 3 पठनीयता के लिए सबसे "अच्छी लग रही" है, और यह संभवतः बाकी की तुलना में बहुत तेज है - इसके अलावा यह प्रारंभिक रन समय लागत है। समस्या यह है कि यह केवल 255 तक के मूल्यों का समर्थन करता है।

वैकल्पिक 1: "00001111".b()

String.prototype.b = function() { return parseInt(this,2); }

वैकल्पिक 2: b("00001111")

function b(i) { if(typeof i=='string') return parseInt(i,2); throw "Expects string"; }

वैकल्पिक 3: b00001111

यह संस्करण आपको 8 अंकों के बाइनरी b00000000, 4 अंक b0000और चर अंकों को टाइप करने की अनुमति देता है b0। यह b01अवैध है, आपको उपयोग करना है b0001या b1

String.prototype.lpad = function(padString, length) {
    var str = this;
    while (str.length < length)
        str = padString + str;
    return str;
}
for(var i = 0; i < 256; i++)
    window['b' + i.toString(2)] = window['b' + i.toString(2).lpad('0', 8)] = window['b' + i.toString(2).lpad('0', 4)] = i;

6

यह उपयोगी हो सकता है:

var bin = 1111;
var dec = parseInt(bin, 2);
// 15

10
प्यारा, अगर थोड़ा अजीब है। लेकिन वह आपके लिए जावास्क्रिप्ट है। binको एक संख्या सौंपी जाती है जो ऐसा लगता है जैसे कि यह बाइनरी में है, लेकिन वास्तव में पार्स बेस हो रहा है। parseIntफ़ंक्शन को पहले arg के रूप में एक स्ट्रिंग की उम्मीद है, इसलिए यह इसे "1111" (बेस 10 प्रतिनिधित्व) में बदल देता है, फिर इसे फिर से पार्स करता है जैसे कि यह आधार 2 था
टेड हॉप

2

नहीं, लेकिन आप parseInt का उपयोग कर सकते हैं और वैकल्पिक रूप से उद्धरणों को छोड़ सकते हैं।

parseInt(110, 2); // this is 6 
parseInt("110", 2); // this is also 6

उद्धरण को छोड़ने का एकमात्र नुकसान यह है कि, बहुत बड़ी संख्या के लिए, आप तेजी से बह जाएंगे:

parseInt(10000000000000000000000, 2); // this gives 1
parseInt("10000000000000000000000", 2); // this gives 4194304

1

बाइनरी स्ट्रिंग्स को संख्याओं और वीज़ा-वर्सा में बदलें।

var b = function(n) {
    if(typeof n === 'string')
        return parseInt(n, 2);
    else if (typeof n === 'number')
        return n.toString(2);
    throw "unknown input";
};

-1

मुझे पता है कि यह वास्तव में पूछे गए प्रश्न का उत्तर नहीं देता है (जो पहले से ही कई बार उत्तर दिया गया था) जैसा कि मैंने सुझाव दिया है कि आप (या इस विषय में रुचि रखने वाले अन्य) इस तथ्य पर विचार करते हैं कि सबसे पठनीय और पीछे / भविष्य / क्रॉस ब्राउज़र-संगत तरीका सिर्फ हेक्स प्रतिनिधित्व का उपयोग करना होगा।

क्यू के phrasing से ऐसा लगता है कि आप केवल अपने कोड में द्विआधारी शाब्दिक का उपयोग करने के बारे में बात कर रहे हैं और संख्यात्मक मानों के बाइनरी अभ्यावेदन का प्रसंस्करण नहीं है (जिसके लिए parstInt जाने का रास्ता है)।

मुझे संदेह है कि कई प्रोग्रामर हैं जिन्हें बाइनरी नंबर को संभालने की आवश्यकता है जो 0-F से 0000-1111 की मैपिंग से परिचित नहीं हैं। इसलिए मूल रूप से चार के समूह बनाते हैं और हेक्स नोटेशन का उपयोग करते हैं।

इसलिए 101000000010 लिखने के बजाय आप 0xA02 का उपयोग करेंगे जिसका ठीक वही अर्थ है और वह अधिक पठनीय है और त्रुटियों की संभावना कम है।

केवल पठनीयता पर विचार करें, उन में से जो बड़ा है:
10001000000010010 या 1001000000010010 की तुलना करें

और क्या होगा अगर मैं उन्हें इस तरह
लिखूं : 0x11012 या 0x9012


-3
// Conversion function
function bin(nb)
{
    return parseInt(nb.toString(2));
}

// Test
var stop = false;
while(!stop)
{
    var n = parseInt(prompt("Type a decimal number : "));
    alert(bin(n));

    var str = prompt("Retry ? Y / N");
    if(str === "N") { stop = true; }
}

parseInt (बिना दूसरे पैरामीटर के) बाइनरी स्ट्रिंग को एक बेस 10 नंबर में परिवर्तित करता है! जैसे 0b100 (4) 100 हो जाता है और फिर सतर्क होकर वापस स्ट्रिंग में बदल जाता है!
टॉम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.