我有一组十进制数。我需要检查每个中是否设置了特定位。如果该位置位,我需要返回1,否则返回0。 我正在寻找一种简单快捷的方法。 比如说,我正在检查是否设置了第三位。我可以做(编号AND(2 ^ 2)),如果该位置位则返回4,否则返回0.如何让它返回1而不是4? 谢谢!
if ((number AND (2^bitnumber) <> 0) then return 1 else return 0 end if
如果您可以将返回类型更改为布尔值,那么这将更加优雅
return ((number AND (2^bitnumber)) <> 0)
虽然划分解决方案很简单,但我认为位移操作会更有效率。不过,你必须测试它才能确定。例如,如果您使用的是基于1的位索引,则可以执行以下操作:
Dim oneOrZero As Integer = (k And 2 ^ (n - 1)) >> (n - 1)
(其中k是数字,n是位索引)。当然,如果您使用基于0的位索引,您可以这样做:
Dim oneOrZero As Integer = (k And 2 ^ n) >> n
对不起,伙计们,我今天太慢了。 要测试十进制数“k”中的位数“n”: (k AND 2 ^(n-1))/(2 ^(n-1)) 如果该位置位则返回1,否则返回0。 ================================================== === 大家好! 我将三个提出的解决方案的性能与从零开始的索引进行了比较,结果如下: “位移解决方案” - 8.31秒 “如果...那么解决方案” - 8.44秒 “分裂解决方案” - 9.41秒 时间是连续四次运行的平均值。 令我惊讶的是,第二种解决方案胜过第三种解决方案。 但是,在我以这种方式修改“分区解决方案”之后: p = 2 ^ n:oneOrZero =(k和p)/ p 它开始在7.48秒内运行。 因此,这是所提出的解决方案中最快的(尽管Keith说:-)。 谢谢大家的帮助!
我真的不知道它是否可以帮助任何人超过上述,但是,我们走了。
当我需要快速检查数字时,我直接比较该位的十进制值。
我的意思是,如果我需要看到第6位打开(32),我检查它的十进制值,如下所示:
if x and 32 = 32 then "the bit is ON"
例如,尝试使用32,4和2 ...以及其他位检查38。您将看到仅打开实际位。
我希望它可以提供帮助。