如何检查是否设置了一个位(没有按位操作)?
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
(这里只有 0
和 1
是可能的——范围总是 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
查看 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
(这里只有 0
和 1
是可能的——范围总是 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