如何在JavaScript中将整数转换为二进制文件?

我希望在二进制中看到整数,正数或负数。

而是喜欢这个问题 ,但对于JavaScript。

此答案尝试使用Number.MAX_SAFE_INTEGER (或2**53-1 )和2**31之间的绝对值来寻址整数。 目前的解决scheme只处理32位内的有符号整数,但是这个解决scheme将使用float64ToInt64Binary()以64位二进制补码forms输出:

 // IIFE to scope internal variables var float64ToInt64Binary = (function () { // create union var flt64 = new Float64Array(1) var uint16 = new Uint16Array(flt64.buffer) // 2**53-1 var MAX_SAFE = 9007199254740991 // 2**31 var MAX_INT32 = 2147483648 function uint16ToBinary() { var bin64 = '' // generate padded binary string a word at a time for (var word = 0; word < 4; word++) { bin64 = uint16[word].toString(2).padStart(16, 0) + bin64 } return bin64 } return function float64ToInt64Binary(number) { // NaN would pass through Math.abs(number) > MAX_SAFE if (!(Math.abs(number) <= MAX_SAFE)) { throw new RangeError('Absolute value must be less than 2**53') } var sign = number < 0 ? 1 : 0 // shortcut using other answer for sufficiently small range if (Math.abs(number) <= MAX_INT32) { return (number >>> 0).toString(2).padStart(64, sign) } // little endian byte ordering flt64[0] = number // subtract bias from exponent bits var exponent = ((uint16[3] & 0x7FF0) >> 4) - 1023 // encode implicit leading bit of mantissa uint16[3] |= 0x10 // clear exponent and sign bit uint16[3] &= 0x1F // check sign bit if (sign === 1) { // apply two's complement uint16[0] ^= 0xFFFF uint16[1] ^= 0xFFFF uint16[2] ^= 0xFFFF uint16[3] ^= 0xFFFF // propagate carry bit for (var word = 0; word < 3 && uint16[word] === 0xFFFF; word++) { // apply integer overflow uint16[word] = 0 } // complete increment uint16[word]++ } // only keep integer part of mantissa var bin64 = uint16ToBinary().substr(11, Math.max(exponent, 0)) // sign-extend binary string return bin64.padStart(64, sign) } })() console.log('8') console.log(float64ToInt64Binary(8)) console.log('-8') console.log(float64ToInt64Binary(-8)) console.log('2**33-1') console.log(float64ToInt64Binary(2**33-1)) console.log('-(2**33-1)') console.log(float64ToInt64Binary(-(2**33-1))) console.log('2**53-1') console.log(float64ToInt64Binary(2**53-1)) console.log('-(2**53-1)') console.log(float64ToInt64Binary(-(2**53-1))) console.log('2**52') console.log(float64ToInt64Binary(2**52)) console.log('-(2**52)') console.log(float64ToInt64Binary(-(2**52))) 
 .as-console-wrapper { max-height: 100% !important; } 

 function dec2bin(dec){ return (dec >>> 0).toString(2); } dec2bin(1); // 1 dec2bin(-1); // 11111111111111111111111111111111 dec2bin(256); // 100000000 dec2bin(-256); // 11111111111111111111111100000000 

您可以使用Number.toString(2)函数,但它在表示负数时有一些问题。 例如, (-1).toString(2)输出是"-1"

要解决此问题,可以使用无符号右移位运算符( >>> )将您的编号强制为无符号整数。

如果你运行(-1 >>> 0).toString(2)你将把你的数字0位移到右边,这不会改变数字本身,但是它将被表示为一个无符号整数。 上面的代码将正确输出"11111111111111111111111111111111"

这个问题有进一步的解释。

-3 >>> 0 (右边的逻辑移位)强制它的参数为无符号整数,这就是为什么你得到32的二进制补码表示-3。


注1 :这个答案需要一个数字作为参数,所以转换你的相应。

注2 :结果是一个没有前导零的string,所以相应地填零。

尝试

 num.toString(2); 

2是基数,可以是2到36之间的任何基数

来源于此

更新:

这只适用于正数,JavaScript代表负二进制整数,以二进制表示。 我做了这个应该做的小function,我没有正确地testing它:

 function dec2Bin(dec) { if(dec >= 0) { return dec.toString(2); } else { /* Here you could represent the number in 2s compliment but this is not what JS uses as its not sure how many bits are in your number range. There are some suggestions https://stackoverflow.com/questions/10936600/javascript-decimal-to-binary-64-bit */ return (~dec).toString(2); } } 

我从这里得到了一些帮助

一个简单的方法是…

 Number(42).toString(2); // "101010" 

“转换为二进制”中的二进制可以指三个主要的东西。 位置数字系统,内存中的二进制表示或32位string。 (对于64位的位串,请参阅Patrick Roberts的答案 )

1.数字系统

(123456).toString(2)将数字转换为基本2 位置数字系统 。 在这个系统中,负数用减号表示,就像十进制一样。

2.内部表示

数字的内部表示是64位浮点 ,在这个答案中讨论了一些限制。 有没有简单的方法来创build一个在javascript中的位串表示,也不访问特定的位。

3.掩码和按位运算符

MDN 很好地概述了按位运算符是如何工作的。 重要的:

按位运算符将它们的操作数视为一个32位 (零和1)序列,

在应用操作之前,将64位浮点数转换为32位有符号整数。 他们被转换回来之后。

以下是将数字转换为32位string的MDN示例代码。

 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; } createBinaryString(0) //-> "00000000000000000000000000000000" createBinaryString(123) //-> "00000000000000000000000001111011" createBinaryString(-1) //-> "11111111111111111111111111111111" createBinaryString(-1123456) //-> "11111111111011101101101110000000" createBinaryString(0x7fffffff) //-> "01111111111111111111111111111111" 

注 – 基本(x>>>0).toString(2); 当x是正数时有一个小问题。 我有一些示例代码在我的答案结束时,仍然使用>>>更正了>>>方法的问题。

 (-3>>>0).toString(2); prints -3 in 2s complement. 1111111111101 

一个工作的例子

 C:\>type n1.js console.log( (-3 >>> 0).toString(2) ); C:\> C:\>node n1.js 11111111111111111111111111111101 C:\> 

这在URL栏是另一个快速certificate

 javascript:alert((-3>>>0).toString(2)) 

注 – 结果是有点有缺陷的,因为它总是以1开始,对于负数是好的。 对于正数,你应该在开始前添加一个0,这样结果就是二进制补码。 所以(8>>>0).toString(2)产生了1000个不是真正的8位二进制补码,而是预先设置了0,使得01000,在2s中是正确的8。 在正确的二进制补码中,任何以0开始的位串都是> = 0,任何以1开始的位串都是负数。

例如,这个问题已经解决了

 // or x=-5 whatever number you want to view in binary x=5; if(x>0) prepend="0"; else prepend=""; alert(prepend+((x>>>0)).toString(2)); 

其他的解决scheme是来自安南的解决scheme(尽pipe安南的解释和定义充满了错误,他有代码来产生正确的输出),还有帕特里克的解决scheme。

任何人不明白从0开始的正数和以2开始的负数1的事实,可以用2s补码检查这个SO QnA。 什么是“2的补充”?

你可以编写自己的函数来返回一个位数组。 示例如何将数字转换为位

除数| 股息| 比特/余数

2 | 9 | 1

2 | 4 | 0

2 | 2 | 0

〜| 1 |〜

上面的例子:2 * 4 = 8,余数是1,所以9 = 1 0 0 1

 function numToBit(num){ var number = num var result = [] while(number >= 1 ){ result.unshift(Math.floor(number%2)) number = number/2 } return result } 

从下往上读取剩余部分。 数字1在中间到顶部。

这是我的代码:

 var x = prompt("enter number", "7"); var i = 0; var binaryvar = " "; function add(n) { if (n == 0) { binaryvar = "0" + binaryvar; } else { binaryvar = "1" + binaryvar; } } function binary() { while (i < 1) { if (x == 1) { add(1); document.write(binaryvar); break; } else { if (x % 2 == 0) { x = x / 2; add(0); } else { x = (x - 1) / 2; add(1); } } } } binary();