Есть ли "0b" или что-то подобное для представления двоичного числа в Javascript
Я знаю, что 0x - это префикс для шестнадцатеричных чисел в Javascript. Например, 0xFF обозначает число 255.
есть ли что-то подобное для двоичных чисел ? Я бы ожидал 0b1111 количество номеров 15, но это не работает для меня.
10 ответов:
обновление:
новые версии JavaScript -- в частности ECMAScript 6 -- добавили поддержку двоичного кода (префикс
0b) и восьмеричные (префикс0o) числовые литералы:var foo = 0b1111; // foo will be set to 15 var bar = 0o17; // bar will be set to 15эта функция уже доступна в Firefox и Chrome. В настоящее время он не поддерживается в IE, но, по-видимому, будет, когда Spartan прибудет.
(спасибо точка с запятойс комментарием и urish это!--18--> для расшивки это.)
Оригинальный Ответ:
нет, нет эквивалента для двоичных чисел. JavaScript поддерживает только числовые литералы в десятичном (без префикса), шестнадцатеричном (префикс
0x) и восьмеричные (префикс0) форматы.одна из возможных альтернатив-передать двоичную строку в
parseIntметод вместе с основанием:var foo = parseInt('1111', 2); // foo will be set to 15
в ECMASCript 6 это будет поддерживаться как часть языка, т. е.
0b1111 === 15- Это правда. Вы также можете использовать верхний регистр B (например,0B1111).искать
NumericLiteralsна ES6 Spec.
Я знаю, что люди говорят, что расширение прототипов не очень хорошая идея, но был ваш сценарий...
Я делаю это так:
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
Если ваша основная задача-отображение, а не кодирование, есть встроенная система преобразования, которую вы можете использовать:
var num = 255; document.writeln(num.toString(16)); // Outputs: "ff" document.writeln(num.toString(8)); // Outputs: "377" document.writeln(num.toString(2)); // Outputs: "11111111"
насколько я знаю, это не возможно, чтобы использовать бинарные denoter в JavaScript. У меня есть три решения, каждое из которых имеет свои проблемы. Я думаю, что Альтернатива 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и переменной digitsb0. То есть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;
нет, но вы можете использовать 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
преобразование двоичных строк в числа и наоборот.
var b = function(n) { if(typeof n === 'string') return parseInt(n, 2); else if (typeof n === 'number') return n.toString(2); throw "unknown input"; };
Я знаю, что это на самом деле не отвечает на заданный Q (который уже отвечал несколько раз), как есть, однако я предлагаю вам (или другим заинтересованным в этой теме) рассмотреть тот факт, что наиболее читаемым и обратно/будущим/кросс-браузерным способом было бы просто использовать шестнадцатеричное представление.
из формулировки Q кажется, что вы говорите только об использовании двоичных литералов в своем коде, а не о обработке двоичных представлений числовых значений (для которого parstInt-это путь).
Я сомневаюсь, что есть много программистов, которым нужно обрабатывать двоичные числа, которые не знакомы с отображением 0-F на 0000-1111. поэтому в основном сделайте группы из четырех и используйте шестнадцатеричную нотацию.
поэтому вместо записи 101000000010 вы бы использовали 0xA02, который имеет точно такое же значение и гораздо более читаемый и менее менее вероятный для ошибок.
просто рассмотрите читаемость, попробуйте сравнить, какой из них больше:
10001000000010010 или 1001000000010010а что если я напишу вот так:
0x11012 или 0x9012
// 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; } }
Comments