我希望看到以二进制形式表示的整数,可以是正数或负数。
就像这个问题一样,但是针对JavaScript。
我希望看到以二进制形式表示的整数,可以是正数或负数。
就像这个问题一样,但是针对JavaScript。
function dec2bin(dec) {
return (dec >>> 0).toString(2);
}
console.log(dec2bin(1)); // 1
console.log(dec2bin(-1)); // 11111111111111111111111111111111
console.log(dec2bin(256)); // 100000000
console.log(dec2bin(-256)); // 11111111111111111111111100000000
Number.toString(2)
函数,但在表示负数时会出现一些问题。例如,(-1).toString(2)
的输出为"-1"
。>>>
)将数字强制转换为无符号整数。(-1 >>> 0).toString(2)
,你将把你的数字向右移动0位,这不会改变数字本身,但它将被表示为无符号整数。上面的代码将正确输出"11111111111111111111111111111111"
。
此问题有进一步的解释。
-3 >>> 0
(右移0位)将其参数强制转换为无符号整数,因此您会得到-3的32位二进制补码表示。
尝试一下
num.toString(2);
2是基数,可以是2到36之间的任意进制
来源在这里
更新:
这只适用于正数,Javascript用二补码表示负二进制整数。我编写了这个小函数,应该可以解决问题,但我没有正确测试过:
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://dev59.com/DGTWa4cB1Zd3GeqPGLg9
*/
return (~dec).toString(2);
}
}
我从这里得到了一些帮助。
-3
返回 1
)。此外,我认为 dec > 0
应该改为 dec >= 0
,这至少可以修复 0。因为 dec2Bin(0)
返回 10
。 - Adam Merrifield一个简单的方法就是...
Number(42).toString(2);
// "101010"
(42).toString(2)
。 - Willem D'Haeseleer1.
,它与1.0
相同,或者仅写1
(同样地,你也可以省略前面部分并写成.5
而不是0.5
)。所以,在这个例子中,第一个点是小数点,它是数字的一部分,而第二个点是调用该数字方法的点操作符。你必须使用两个点(或将数字括在括号中),不能仅写成42.toString(2)
,因为解析器会将点视为小数点,并因缺少点操作符而抛出错误。 - kapex'convert to binary' 中的二进制可以指三个主要方面:位置计数法、内存中的二进制表示或32位比特串。 (对于64位比特串,请参见Patrick Roberts的答案)
1. 数字系统
(123456).toString(2)
将数字转换为基数为2的位置记数法。在此系统中,负数像十进制数一样以减号写入。
2. 内部表示
数字的内部表示是64位浮点数,有一些限制在这个答案中进行了讨论。在JavaScript中没有简单的方法来创建它的比特串表示,也无法访问特定位。
3. 掩码和按位运算符
MDN提供了良好的概述,介绍了按位运算符的工作原理。重要的是:
按位运算符将它们的操作数视为一系列32位(零和一)
在执行操作之前,64位浮点数会被转换为32位有符号整数。然后它们会被转换回来。
下面是MDN示例代码,用于将数字转换为32位字符串。
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=536870912; if(x>0) prepend="0"; else prepend=""; alert(prepend+((x>>>0)).toString(2).toString());
怎么样? - barlop这个答案尝试解决绝对值在214748364810 (231) - 900719925474099110 (253-1)范围内的输入。
twosComplement
,可靠地将任何安全整数转换为64位二进制补码表示法:
function toBinary (value) {
if (!Number.isSafeInteger(value)) {
throw new TypeError('value must be a safe integer');
}
const negative = value < 0;
const twosComplement = negative ? Number.MAX_SAFE_INTEGER + value + 1 : value;
const signExtend = negative ? '1' : '0';
return twosComplement.toString(2).padStart(53, '0').padStart(64, signExtend);
}
function format (value) {
console.log(value.toString().padStart(64));
console.log(value.toString(2).padStart(64));
console.log(toBinary(value));
}
format(8);
format(-8);
format(2**33-1);
format(-(2**33-1));
format(2**53-1);
format(-(2**53-1));
format(2**52);
format(-(2**52));
format(2**52+1);
format(-(2**52+1));
.as-console-wrapper{max-height:100%!important}
对于老旧的浏览器,存在以下函数和值的polyfills:
作为额外的奖励,如果您在BigInt
中使用两个补码转换来支持任何基数(2-36),并在⌈64 / log2(radix)⌉位数字中执行,则可以实现此功能:
function toRadix (value, radix) {
if (!Number.isSafeInteger(value)) {
throw new TypeError('value must be a safe integer');
}
const digits = Math.ceil(64 / Math.log2(radix));
const twosComplement = value < 0
? BigInt(radix) ** BigInt(digits) + BigInt(value)
: value;
return twosComplement.toString(radix).padStart(digits, '0');
}
console.log(toRadix(0xcba9876543210, 2));
console.log(toRadix(-0xcba9876543210, 2));
console.log(toRadix(0xcba9876543210, 16));
console.log(toRadix(-0xcba9876543210, 16));
console.log(toRadix(0x1032547698bac, 2));
console.log(toRadix(-0x1032547698bac, 2));
console.log(toRadix(0x1032547698bac, 16));
console.log(toRadix(-0x1032547698bac, 16));
.as-console-wrapper{max-height:100%!important}
如果你对我以前的回答感兴趣,该回答使用ArrayBuffer
来创建Float64Array
和Uint16Array
之间的联合,请参考此回答的修订历史。
x.toString(2)
,但对于负数无效,它只是在其中插入一个减号,这是不好的。(x>>>0).toString(2);
,对于负数是可以的,但当x为正数时有一个小问题。它的输出以1开头,对于正数来说不是正确的二进制补码。function createBinaryString(nMask) {
// nMask must be between -2147483648 and 2147483647
if (nMask > 2**31-1)
throw "number too large. number shouldn't be > 2**31-1"; //added
if (nMask < -1*(2**31))
throw "number too far negative, number shouldn't be < -(2**31)" //added
for (var nFlag = 0, nShifted = nMask, sMask = ''; nFlag < 32;
nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1);
sMask=sMask.replace(/\B(?=(.{8})+(?!.))/g, " ") // added
return sMask;
}
console.log(createBinaryString(-1)) // "11111111 11111111 11111111 11111111"
console.log(createBinaryString(1024)) // "00000000 00000000 00000100 00000000"
console.log(createBinaryString(-2)) // "11111111 11111111 11111111 11111110"
console.log(createBinaryString(-1024)) // "11111111 11111111 11111100 00000000"
//added further console.log example
console.log(createBinaryString(2**31 -1)) //"01111111 11111111 11111111 11111111"
nMask
的名称可能是因为整数被视为 _位掩码_,然后 nMask
指的是 _多个掩码_(一个或多个掩码集合成一个)。请参见“自动创建掩码”一节:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators - Magne您可以编写自己的函数,返回一个位数组。
将数字转换为位的示例:
上述行的示例: 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位于中间到顶部。
Math.floor(number%2)
而不是 number = Math.floor(number/2)
? - Pacerierconst decbin = nbr => {
if(nbr < 0){
nbr = 0xFFFFFFFF + nbr + 1
}
return parseInt(nbr, 10).toString(2)
};
function toBinary(n){
let binary = "";
if (n < 0) {
n = n >>> 0;
}
while(Math.ceil(n/2) > 0){
binary = n%2 + binary;
n = Math.floor(n/2);
}
return binary;
}
console.log(toBinary(7));
console.log(toBinary(-7));
11111111111111111111111111111111
,将7表示为111
。在二进制补码中,1111111和111表示同一个数字,即-1。 - barlopfunction intToBinary(number, res = "") {
if (number < 1)
if (res === "") return "0"
else
return res
else return intToBinary(Math.floor(number / 2), number % 2 + res)
}
console.log(intToBinary(12))
console.log(intToBinary(546))
console.log(intToBinary(0))
console.log(intToBinary(125))