是否存在“ 0b”或类似的东西来表示Javascript中的二进制数


130

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

二进制数字有类似的东西吗?我希望0b1111代表这个数字15,但这对我不起作用。


1
出于好奇:您为什么需要在Javascript中使用二进制文字?Javascript的高级特性意味着它通常不需要与需要二进制文字的低级构造进行交互。
约阿希姆·绍尔

19
因为这样,代码将更具可读性。我的实现基于一些使用二进制数的规范。
米莎·莫罗什科

5
使用节点js进行机器人技术是可能需要二进制文件的一个很好的例子
Greg Woods

您可以考虑使用数字分隔符以提高可读性。0b0111_0_1_0_1
КонстантинВан”,19年

Answers:


181

更新:

较新的JavaScript版本-特别是ECMAScript 6-增加了对二进制(prefix 0b),八进制(prefix 0o)和十六进制(prefix 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到来时会支持。

(感谢分号的评论和urish的回答指出了这一点。)

原始答案:

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

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

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

2
@MishaMoroshko我同意,但是很少有语言0b支持。
阿尔巴·门德斯

5
从技术上讲,JavaScript不具有八进制表示法,尽管大多数(全部?)浏览器都支持八进制表示法。严格模式下明确禁止这样做。
Deebster

5
请注意,在JavaScript内部,每个数字都是64位浮点数,没有整数这样的东西。因此,数量巨大时,您将失去准确性。最大的精确“整数”是2 ^ 53,或9007199254740992
祖帕

5
有整数,因为整数是一个数学术语,所以没有int typenor integer type,因此所有整数都存储为浮点数。
珀金斯

3
当时的答案是正确的,但可以使用更新。正如urish在下面的回答中指出的那样,ES6中包含二进制和八进制数字的文字(八进制现在写为“ 0o1”)。他们已经登陆Firefox,Chrome,甚至是新IE(Spartan)的预览版。
分号

29

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

NumericLiteralsES6规范中查找。


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)可能是实际答案!
Alexis Wilke

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"

参考: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,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;

6

可能会有用:

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

10
可爱,如果有点奇怪。但这就是您的JavaScript。bin被分配了一个看起来像二进制形式的数字,但实际上是被解析为基数10。该parseInt函数期望将字符串作为第一个arg,因此它将其转换为“ 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映射的二进制数。因此基本上是四人一组,并使用十六进制表示法。

因此,您不必使用完全相同的含义,而是可读性更高,出错的可能性更少的0xA02,而不是编写101000000010。

只考虑可读性,尝试比较哪个更大:
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,然后通过警报转回字符串!
汤姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.