Я знаю, что 0x
является префиксом для шестнадцатеричных чисел в Javascript. Например, 0xFF
означает номер 255.
Есть ли что-то подобное для двоичных чисел? Я бы ожидал, что 0b1111
будет представлять число 15
, но это не работает для меня.
Я знаю, что 0x
является префиксом для шестнадцатеричных чисел в Javascript. Например, 0xFF
означает номер 255.
Есть ли что-то подобное для двоичных чисел? Я бы ожидал, что 0b1111
будет представлять число 15
, но это не работает для меня.
Update:
Более новые версии 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, но, по-видимому, будет, когда придет спартанец.
(Спасибо Semicolon и сообщить о том, как это сделать.)
Исходный ответ:
Нет, для двоичных чисел нет эквивалента. JavaScript поддерживает только числовые литералы в десятичных (без префикса), шестнадцатеричных (префикс 0x
) и восьмеричных (префикс 0
) форматах.
Одна из возможных альтернатив - передать двоичную строку методу parseInt
вместе с основанием:
var foo = parseInt('1111', 2); // foo will be set to 15
В ECMASCript 6 это будет поддерживаться как часть языка, т.е. 0b1111 === 15
истинно. Вы также можете использовать прописную букву B (например, 0B1111
).
Найдите BinaryIntegerLiteral
в ES6 Spec Draft.
Если ваша основная проблема заключается в отображении, а не в кодировании, есть встроенная система преобразования, которую вы можете использовать:
var num = 255;
document.writeln(num.toString(16)); // Outputs: "ff"
document.writeln(num.toString(8)); // Outputs: "377"
document.writeln(num.toString(2)); // Outputs: "11111111"
Ссылка: Ссылка на номер JavaScript
Я знаю, что люди говорят, что продление прототипов не является хорошей идеей, но было вашим script...
Я делаю так:
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
Насколько я знаю, в 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
и переменные цифры 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;
Возможно, это будет полезно:
var bin = 1111;
var dec = parseInt(bin, 2);
// 15
Преобразование двоичных строк в числа и наоборот.
var b = function(n) {
if(typeof n === 'string')
return parseInt(n, 2);
else if (typeof n === 'number')
return n.toString(2);
throw "unknown input";
};
Нет, но вы можете использовать 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
Я знаю, что это фактически не отвечает на заданный вопрос 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; }
}