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

Mis*_*hko 117 javascript

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

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

Luk*_*keH 161

更新:

较新版本的JavaScript - 特别是ECMAScript 6 - 增加了对二进制(前缀0b)和八进制(前缀0o)数字文字的支持:

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
Run Code Online (Sandbox Code Playgroud)

此功能已在Firefox和Chrome中提供.它目前在IE中不受支持,但显然是在斯巴达到来时.

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

原答案:

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

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

var foo = parseInt('1111', 2);    // foo will be set to 15
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,虽然大多数(所有?)浏览器都支持它,但JavaScript并不具备八进制表示法.它在严格模式下明确禁止. (5认同)
  • 请注意,在JavaScript内部,每个数字都是64位浮点数,没有整数这样的东西.因此,数量庞大,你的准确性会下降.最大的精确"整数"是2 ^ 53,或9007199254740992. (5认同)
  • 有整数,因为整数是一个数学术语,没有`int type`或`integer type`,所以所有整数都存储为浮点数. (5认同)
  • 这个答案在当时是正确的,但它可以使用更新.正如他在下面的回答中指出的那样,二进制和八进制数字的文字(八进制现在写成"0o1")在ES6中.他们已经登陆Firefox,Chrome,甚至是新IE(Spartan)的预览版. (3认同)
  • @MishaMoroshko我同意,但很少有语言有'0b`支持. (2认同)

uri*_*ish 24

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

NumericLiteralsES6规格中寻找.


Jua*_*cia 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
Run Code Online (Sandbox Code Playgroud)

  • 这很酷!8-)注意,`ParseInt(“ 101”,2)`可能是实际答案! (2认同)

Pop*_*ops 19

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

var num = 255;
document.writeln(num.toString(16)); // Outputs: "ff"
document.writeln(num.toString(8)); // Outputs: "377"
document.writeln(num.toString(2)); // Outputs: "11111111"
Run Code Online (Sandbox Code Playgroud)

参考:JavaScript编号参考


fro*_*rli 11

据我所知,在Javascript中不可能使用二进制表示器.我有三个解决方案,所有这些都有他们的问题.我认为备选方案3对于可读性而言是最"好看的",它可能比其他方式快得多 - 除了它的初始运行时间成本.问题是它只支持最多255的值.

备选方案1: "00001111".b()

String.prototype.b = function() { return parseInt(this,2); }
Run Code Online (Sandbox Code Playgroud)

备选方案2: b("00001111")

function b(i) { if(typeof i=='string') return parseInt(i,2); throw "Expects string"; }
Run Code Online (Sandbox Code Playgroud)

备选方案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;
Run Code Online (Sandbox Code Playgroud)


Ser*_*lov 6

可能这将是有用的:

var bin = 1111;
var dec = parseInt(bin, 2);
// 15
Run Code Online (Sandbox Code Playgroud)

  • 可爱,如果有点奇怪.但那是你的JavaScript.`bin`被赋予一个看起来像是二进制的数字,但实际上是被解析为基数10.`parseInt`函数需要一个字符串作为第一个arg,所以它把它变成"1111"(基数10表示),然后重新解析它就像它是基数2一样. (8认同)