基数为10的基数为2的数字转换如何工作?

时间:2014-07-03 08:28:43

标签: javascript theory number-formatting

我试图理解以下代码,可以在MDN中找到,也可以回答相关的question。 (仅在FF 30中测试过。)

function createBinaryString (nMask) {
    // nMask must be between -2147483648 and 2147483647
    for (var nFlag = 0, nShifted = nMask, sMask = ""; nFlag < 32;
        nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1);
    return sMask;
}
var p = createBinaryString(7);
console.log(p); //"00000000000000000000000000000111"

这个是MDN,但这是如何工作的 - 我感谢任何可以理解的解释。 我有二元运算符的基本知识,并且知道有.toString(2)方法。但是String(nShifted >>> 31)部分究竟做了什么?

这是更好的可读版本,但第一个不起作用。在这里,我也很感激任何关于我做错的建议。我看不出第二个工作版本有什么不同。

var re = '';
var numb = 7;
var shiftBuf = numb;
for (var i = 0; i < 32; i++); {
   re += String(shiftBuf >>> 31);
   shiftBuf <<= 1;
}
console.log(re); //"0" 

var result = '';
var num = 7;
var shiftBuffer = num;
for (var i = 0; i < 32; i++) {
   result += String(shiftBuffer >>> 31);
   shiftBuffer <<= 1;
}
console.log(result); //"00000000000000000000000000000111"

1 个答案:

答案 0 :(得分:0)

这里重要的假设是初始数小于2 ^ 32。在这种情况下,它只是以二进制表示形式检索数字后的数字。

re += String(shiftBuf >>> 31);
shiftBuf <<= 1;

第一行添加shiftBuf向右移动了31个位置re,第二行向左移动shiftBuf。所以基本上它只是数字。这是一个例子。如果是shiftBuf = 7;,那么在二进制表示中它是111。添加缺失的零,你有

00000000000000000000000000000111

一步一步:

[0] shiftBuf >>> 31 produces 0  // picks first digit if shiftBuf < 2^32
[0] result is now "0"
[0] shitBuffer <<= 1 produces 00000000000000000000000000001110

[1] shiftBuf >>> 31 produces 0
[1] result is now "00"
[1] shitBuffer <<= 1 produces 00000000000000000000000000011100

[2] shiftBuf >>> 31 produces 0
[2] result is now "000"
[2] shitBuffer <<= 1 produces 00000000000000000000000000111000

...

[30] shiftBuf >>> 31 produces 1
[30] result is now "0000000000000000000000000000011"
[30] shitBuffer <<= 1 produces 10000000000000000000000000000000

[31] shiftBuf >>> 31 produces 1
[31] result is now "00000000000000000000000000000111"
[31] shitBuffer <<= 1 produces 00000000000000000000000000000000

关于你的第二个问题:这两个代码之间的区别在于,在第一个代码中你有for (var i = 0; i < 32; i++);(注意结尾处的分号)。后面的代码(括号{}中的代码)不会在循环中运行。它只运行一次。