Чи є "0b" чи щось подібне, щоб представляти двійкове число у Javascript


130

Я знаю, що 0xце префікс для шістнадцяткових чисел у Javascript. Наприклад, 0xFFозначає число 255.

Чи є щось подібне для двійкових чисел? Я б очікував, що я 0b1111представляю число 15, але це не працює для мене.


1
З цікавості: навіщо вам потрібні бінарні літерали в Javascript? Характер Javascript високого рівня означає, що зазвичай не потрібно взаємодіяти з конструктами низького рівня, які потребують бінарних літералів.
Йоахім Зауер

19
Тому що таким чином код буде більш читабельним. Моя реалізація заснована на деякій специфікації, яка використовує двійкові числа.
Мішко Морошко

5
використання вузла js для робототехніки є хорошим прикладом того, де може знадобитися двійковий файл
Грег Вудс

Ви можете розглянути можливість використання цифрових роздільників для кращої читабельності. 0b0111_0_1_0_1.
Константин Ван

Відповіді:


181

Оновлення:

Новіші версії JavaScript - зокрема 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

Ця функція вже доступна в Firefox та Chrome. Наразі він не підтримується в IE, але, мабуть, буде, коли приїде Spartan.

(Завдяки з коми коментар «s і відповідь urish ігрова вказують на це.)

Оригінальний відповідь:

Ні, для двійкових чисел немає еквівалента. JavaScript підтримує лише числові літерали у десяткових (без префікса), шістнадцяткових (префікс 0x) та восьмеричному (префікс 0) форматах.

Однією з можливих альтернатив є передача двійкового рядка parseIntметоду разом з радіусом:

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

2
@MishaMoroshko Я згоден, але мало мов мають 0bпідтримку.
Альба Мендес

5
Технічно у JavaScript немає восьмеричних позначень, хоча більшість (усіх?) Браузерів підтримує це. У суворому режимі це заборонено.
Дібстер

5
Зауважте, що всередині JavaScript, кожне число є 64-бітовим плаваючим, немає такого поняття, як ціле число. Таким чином, з величезною кількістю ви втрачаєте точність. Найбільше точне "ціле число" - 2 ^ 53, або 9007199254740992.
zupa

5
Є цілі числа, оскільки ціле число є математичним терміном, немає ні int typeнорм integer type, тому всі цілі числа зберігаються як поплавці.
Перкінс

3
Ця відповідь була вірною на той час, але вона могла використовувати оновлення. Як урш вказує у своїй відповіді нижче, буквальні значення для двійкових і восьмеричних чисел (восьмі вісімки тепер пишуться "0o1") знаходяться в ES6. Вони вже приземлилися в Firefox, Chrome і навіть попередній перегляд нового IE (Spartan).
напівколонка

29

У ECMASCript 6 це підтримується як частина мови, тобто 0b1111 === 15є правдою. Ви також можете використовувати великі регістри B (наприклад 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"

Ref: Посилання на номер JavaScript


11

Наскільки я знаю, неможливо використовувати двійковий посилання в 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, чотиризначну 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
Симпатично, якщо трохи дивно. Але це для вас JavaScript. binприсвоюється число, схоже на те, що воно є в двійковому, але насправді розбирається база 10. parseIntФункція очікує рядок як перший аргумент, тому він перетворює його в "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

Я знаю, що це насправді не відповідає на запитаний запитання (на який вже відповіли кілька разів), проте я пропоную вам (або іншим зацікавленим у цій темі) врахувати той факт, що найбільш читабельний та зворотній / майбутній / перехресний сумісний браузер Таким чином, було б просто використовувати шістнадцяткове подання.

З фразоутворення Q здається, що ви говорите лише про використання двійкових літералів у своєму коді, а не обробку двійкових представлень числових значень (для яких 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.