我想以二进制形式查看整数,正数或负数。
很喜欢 这个问题,但是对于 JavaScript。
原文由 barlop 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想以二进制形式查看整数,正数或负数。
很喜欢 这个问题,但是对于 JavaScript。
原文由 barlop 发布,翻译遵循 CC BY-SA 4.0 许可协议
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
(右逻辑移位)将其参数强制为无符号整数,这就是为什么你得到 -3 的 32 位二进制补码表示。原文由 fernandosavio 发布,翻译遵循 CC BY-SA 4.0 许可协议
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
我想采用的解决方案适用于 32 位,是此答案结尾的代码,来自 developer.mozilla.org(MDN),但添加了一些行用于 A)格式化和 B)检查数字在范围内。
一些人建议
x.toString(2)
不适用于负数,它只是在其中贴一个减号,这不好。Fernando 提到了
(x>>>0).toString(2);
这对于负数很好,但当 x 为正数时有一个小问题。它的输出以 1 开头,对于正数,它不是正确的 2s 补码。任何不了解 2s 补码中以 0 开头的正数和以 1 开头的负数这一事实的人都可以在 2s 补码上检查此 SO QnA。 什么是“2的补码”?
一个解决方案可能涉及为正数添加一个 0,我在此答案的早期版本中这样做了。有时可以接受 33 位数字,或者可以确保要转换的数字在 -(2^31)<=x^31-1 范围内。所以这个数字总是32位。但是,您可以在 mozilla.org 上使用此解决方案,而不是这样做
帕特里克的答案和代码很长,显然适用于 64 位,但有一个评论者发现的错误,评论者修复了帕特里克的错误,但帕特里克在他的代码中有一些“幻数”,他没有评论并且有忘记了,帕特里克不再完全理解他自己的代码/它为什么起作用。
Annan 有一些不正确和不清楚的术语,但提到了 developer.mozilla.org 的解决方案
注意 - 旧链接 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators 现在重定向到其他地方并且没有该内容但正确的旧链接,当archive.org 检索页面!,可在此处获得 https://web.archive.org/web/20150315015832/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
那里的解决方案适用于 32 位数字。
代码非常紧凑,三行的函数。
但是我添加了一个正则表达式来格式化输出,以 8 位为一组。基于 如何在 JavaScript 中将逗号打印为千位分隔符(我只是将其修改为从右到左将其分组为 3 秒 并添加 _逗号_,以从右到左分组为 8 秒 并添加 _空格_)
而且,虽然 Mozilla 对 nMask 的大小(输入的数字)发表了评论……它必须在范围内,但当数字超出范围时,他们没有测试或抛出错误,所以我已经补充说。
我不确定他们为什么将参数命名为“nMask”,但我会保持原样。
https://web.archive.org/web/20150315015832/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators