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

时间:2015-07-06 08:43:21

标签: javascript math bit-manipulation

查看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位?

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

3 个答案:

答案 0 :(得分:3)

基础 base <中值 val 中索引编号 index 的'bit'(实际上是任何 base)值/ em>通常可以计算为

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也可能会生成一个低于预期“整数”的浮点数 。也许总是添加一个小常数更安全:

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

答案 1 :(得分:2)

除以要检查的位的值 并测试是否设置了第一位(可以使用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开头(代表nr 1的位)

答案 2 :(得分:1)

您只需检查该位置的-(void)DataReceived { dispatch_async(dispatch_get_main_queue(), ^{ [actInd stopAnimating]; [actInd removeFromSuperview]; // do your UI updates here... }); NSLog(@"data array %@",dm.arrayData); } 是否设置为bit

1

DEMO