Я знаю, що 0xце префікс для шістнадцяткових чисел у Javascript. Наприклад, 0xFFозначає число 255.
Чи є щось подібне для двійкових чисел? Я б очікував, що я 0b1111представляю число 15, але це не працює для мене.
0b0111_0_1_0_1.
Я знаю, що 0xце префікс для шістнадцяткових чисел у Javascript. Наприклад, 0xFFозначає число 255.
Чи є щось подібне для двійкових чисел? Я б очікував, що я 0b1111представляю число 15, але це не працює для мене.
0b0111_0_1_0_1.
Відповіді:
Оновлення:
Новіші версії 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
0bпідтримку.
int typeнорм integer type, тому всі цілі числа зберігаються як поплавці.
У ECMASCript 6 це підтримується як частина мови, тобто 0b1111 === 15є правдою. Ви також можете використовувати великі регістри B (наприклад 0B1111).
Шукайте NumericLiteralsв специфікації ES6 .
Я знаю, що люди кажуть, що розширювати прототипи - це не дуже гарна ідея, але це був ваш сценарій ...
Я роблю це так:
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
ParseInt("101", 2)може бути фактичною відповіддю!
Якщо ваша основна проблема - це відображення, а не кодування, є вбудована система перетворення, яку ви можете використовувати:
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. У мене є три рішення для вас, усі вони мають свої проблеми. Я думаю, що альтернатива 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;
Це може бути корисним:
var bin = 1111;
var dec = parseInt(bin, 2);
// 15
binприсвоюється число, схоже на те, що воно є в двійковому, але насправді розбирається база 10. parseIntФункція очікує рядок як перший аргумент, тому він перетворює його в "1111" (представлення бази 10), а потім повторно аналізує його, як ніби це була база 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
Я знаю, що це насправді не відповідає на запитаний запитання (на який вже відповіли кілька разів), проте я пропоную вам (або іншим зацікавленим у цій темі) врахувати той факт, що найбільш читабельний та зворотній / майбутній / перехресний сумісний браузер Таким чином, було б просто використовувати шістнадцяткове подання.
З фразоутворення 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; }
}