我正在寻找一种方法来在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:
- 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