【发布时间】:2016-09-23 11:59:47
【问题描述】:
我正在寻找一种在 JavaScript 中生成从 0 到 32 位不等宽度的位掩码的方法。这必须适用于从 0 到 32 的所有宽度,因此:
-
bitmask(0)应该以二进制形式返回0(十进制0); -
bitmask(2)应该以二进制形式返回11(十进制3); -
bitmask(5)应该以二进制形式返回11111(十进制31); -
bitmask(32)应该以二进制形式返回11111111111111111111111111111111(十进制4294967295[uint32] 或-1[int32])。
表达式 (1 << width) - 1 适用于从 0 到 30 的宽度。
是否有一个简单的表达式(最好没有 if/else 分支)可以为所有输入范围 (0-32) 完成此操作?
此测试代码说明了我当前的方法在 31 和 32 上是如何失败的:
function bitmask(width) {
return (1 << width) - 1;
}
function test(width){
var result = bitmask(width).toString(2);
console.log(width,
result,
result.replace(/[^1]/g,'').length === width? 'Ok': 'Fail');
}
test(0);
test(1);
test(5);
test(17);
test(30);
test(31); // fails
test(32); // fails
【问题讨论】:
-
我认为你刚刚达到了 js 本身的硬性限制。 “位运算符将其操作数视为 32 位序列...”developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
标签: javascript bit-manipulation bitmask