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设置了位?
(我更喜欢非循环操作,但只使用单个数学短语)
基数中的值val中的索引号索引的“位”(实际上是任何基数)值通常可以计算为
\n\nval = 1966;\nindex = 2;\nbase = 10;\nalert (Math.floor(val/Math.pow(base,index)) % base);\nRun Code Online (Sandbox Code Playgroud)\n\n结果:9
val = 44;\nindex = 3;\nbase = 2;\nalert (Math.floor(val/Math.pow(base,index)) % base);\nRun Code Online (Sandbox Code Playgroud)\n\n结果:(1只有0和1可能在这里 \xe2\x80\x93 ,范围将始终是0..base-1)。
Math.floor(在 Javascript 中强制转换为整数) 和的组合Math.pow在这里有点不确定。即使在整数范围内,也可能生成略低于预期“整数”的Math.pow浮点数。也许总是添加一个小常量更安全:
alert (Math.floor(0.1+val/Math.pow(base,index)) % base);\nRun Code Online (Sandbox Code Playgroud)\n
除以要检查和测试的位的值是否设置了第一位(这可以用 测试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)