是否有“0b”或类似的东西代表Javascript中的二进制数

时间:2010-05-10 13:59:28

标签: javascript

我知道0x是Javascript中十六进制数字的前缀。例如,0xFF代表数字255。

二进制数是否类似?我希望0b1111代表数字15,但这对我不起作用。

10 个答案:

答案 0 :(得分:145)

<强>更新

较新版本的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到来的时候。

(感谢Semicolon的评论和urish's answer指出这一点。)

原始答案:

不,二进制数没有等价物。 JavaScript仅支持十进制(无前缀),十六进制(前缀0x)和八进制(前缀0)格式的数字文字。

一种可能的替代方法是将二进制字符串与基数一起传递给parseInt方法:

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

答案 1 :(得分:23)

在ECMASCript 6中,这将作为语言的一部分得到支持,即0b1111 === 15为真。您也可以使用大写B(例如0B1111)。

ES6 Spec中查找NumericLiterals

答案 2 :(得分:22)

我知道人们说扩展原型不是一个好主意,而是你的脚本......

我是这样做的:

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 :(得分:18)

如果主要关注的是显示而不是编码,那么您可以使用内置转换系统:

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 Number Reference

答案 4 :(得分: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,4位b0000和可变数字b0。这是b01非法,您必须使用b0001b1

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;

答案 5 :(得分:6)

可能会有用:

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

答案 6 :(得分:3)

不,但您可以使用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

答案 7 :(得分: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";
};

答案 8 :(得分:0)

我知道这实际上并没有回答问Q(已经多次回答),但是我建议你(或其他对此主题感兴趣的人)考虑最可读和最易读的事实。向后/未来/跨浏览器兼容的方式是仅使用十六进制表示。

从Q的措辞来看,你似乎只是谈论在你的代码中使用二进制文字,而不是处理数值的二进制表示(parstInt就是这样)。

我怀疑有很多程序员需要处理不熟悉0-F到0000-1111映射的二进制数。 所以基本上组成四个组并使用十六进制表示法。

所以不是写101000000010,而是使用0xA02,它具有完全相同的含义,更具可读性,更不容易出错。

考虑可读性,尝试比较哪些更大:
10001000000010010或1001000000010010

如果我这样写它会怎么样:
0x11012或0x9012

答案 9 :(得分:-2)

// 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; }
}