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

Roy*_*mir 5 javascript math bit-manipulation

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

6个地方:

___  ___  ___  ___  ___   ___
32   16    8    4    2     1
Run Code Online (Sandbox Code Playgroud)

但是,如何检查(例如)8是否已选中?

一个简单的解决方案将是:

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

但是请注意,在后台,计算机将转换44为二进制表示形式,仅检查是否通过按位操作设置了位。

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

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

(我更喜欢非循环操作,但只使用单个数学短语)

usr*_*301 6

基数中的值val中的索引号索引的“位”(实际上是任何基数)值通常可以计算为

\n\n
val = 1966;\nindex = 2;\nbase = 10;\nalert (Math.floor(val/Math.pow(base,index)) % base);\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:9

\n\n
val = 44;\nindex = 3;\nbase = 2;\nalert (Math.floor(val/Math.pow(base,index)) % base);\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:(1只有01可能在这里 \xe2\x80\x93 ,范围将始终是0..base-1)。

\n\n

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

\n\n
alert (Math.floor(0.1+val/Math.pow(base,index)) % base);\n
Run Code Online (Sandbox Code Playgroud)\n


dav*_*993 5

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

数学表达式:

floor(value/(2^bitPos)) mod 2 = 1
Run Code Online (Sandbox Code Playgroud)

作为JS函数:

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

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