如何检查是否设置了一个位(没有按位操作)?

How can I check that a bit is set (without bitwise operation)?

查看 int 44 — 我需要 Math.CEIL (log(2) 44) 个二进制位置来表示 44。 (答案是 6 个地方)

6 个地方:

___  ___  ___  ___  ___   ___
32   16    8    4    2     1

但是我如何检查(例如)8 的位是否被选中?

一个简单的解决方案是:

((1<<3) & 44)>0 所以这将检查该位是否已设置。

但请注意,在幕后,计算机将 44 转换为其二进制表示形式,并仅通过按位运算检查位是否已设置。

另一种解决方案是通过 toString(2)mod%2 循环构建二进制文件

问题

数学上 通过哪个公式,我可以测试是否设置了 n'th 位?

(我更喜欢非循环操作但纯粹的单一数学短语)

除以要检查的位的值 并测试是否设置了第一位(这可以用 x mod 2 == 1 测试)

数学表达式:

floor(value/(2^bitPos)) mod 2 = 1

作为 JS 函数:

function isSet(value, bitPos) {
   var result =   Math.floor(value / Math.pow(2, bitPos)) % 2;
   return result == 1;
}

注意:bitPos以0开头(bit代表nr 1)

索引数index中的'bit'(实际上是任意基)值 val in base base 一般可以计算为

val = 1966;
index = 2;
base = 10;
alert (Math.floor(val/Math.pow(base,index)) % base);

结果:9

val = 44;
index = 3;
base = 2;
alert (Math.floor(val/Math.pow(base,index)) % base);

结果:1(这里只有 01 是可能的——范围总是 0..base-1)。

Math.floor(强制转换为 Javascript 中的整数)和 Math.pow 的组合在这里有点不确定。即使在整数范围内,Math.pow 也可能会生成一个 略低于预期 'whole' 的浮点数 。也许总是添加一个小常量更安全:

alert (Math.floor(0.1+val/Math.pow(base,index)) % base);

你可以简单的检查一下位置的bit是否设置为1

function isBitSet(no, index) {
    var bin = no.toString(2);
    // Convert to Binary

    index = bin.length - index;
    // Reverse the index, start from right to left

    return bin[index] == 1;
}
isBitSet(44, 2); // Check if second bit is set from left

DEMO