【问题标题】:bitwise AND doesn't work on MSB按位 AND 不适用于 MSB
【发布时间】:2013-06-02 10:22:53
【问题描述】:

我通过将位打包到一个 uint 数组中来实现位向量。 getBit(index) 函数执行(array[cell] & (1 << bit)) >> bit 来获取是否已设置位。这对除 MSB 之外的所有位都非常有效。一个不起作用的例子如下。

array[cell] = 11111001 11100000 00000000 00000000
(1 << bit)  = 10000000 00000000 00000000 00000000
& operation = 01111001 11100000 00000000 00000000

我不明白为什么按位与运算似乎像 XOR 一样运行。要么是那个,要么是 MSB 未设置。谁能解释发生了什么?

编辑:实际代码

var cell:uint = int(index / 32);
var bit:uint = 32 - (index % 32) - 1;
return (array[cell] & (1 << bit)) >> bit;

在不起作用的情况下,index = 0

【问题讨论】:

  • 你能粘贴你写的实际代码吗?
  • 性能提示,现在已解决有符号/无符号问题:您可以测试 AND 的结果是否为零,而不是将位移回 LSB 位置。
  • 更好,但是,请参阅下面 Daniel Fisher 优雅而高效的解决方案。
  • 好的,谢谢你的想法!

标签: algorithm actionscript-3 bit-manipulation


【解决方案1】:

使用无符号移位。

(uint(array[cell]) & (uint(1) << bit)) >>> bit

【讨论】:

  • 移位似乎不是问题,&amp; 操作本身给出了错误的结果
  • 好的,在按位与之前将array[cell]转换为uint。
  • :(那也没用
  • 它还需要一个uint,如uint(uint(1) &lt;&lt; bit)。工作完美。谢谢
【解决方案2】:

如果所有的值都是明确定义的,

(array[cell] & (1 << bit)) >> bit

等价于更简单的

(array[cell] >> bit) & 1

对于无符号整数。

我不熟悉动作脚本,但1 &lt;&lt; 31 的行为可能很奇怪,因为1 是有符号整数。

除此之外,

var bit:uint = 32 - (index % 32) - 1;

看起来很奇怪,通常会使用index % 32 作为位数。

【讨论】:

  • 关于位数,我将它存储为 MSB 到 LSB。我猜index%32 会将它的 LSB 存储到 MSB。此外,更简单的方程式解决了我的问题,因为我不再需要处理 MSB。谢谢!
  • Aks:至少给它一个 +1,这个优雅的解决方案需要振作起来!
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2019-10-20
  • 2011-01-13
  • 2014-08-03
  • 2014-08-01
  • 1970-01-01
  • 2012-02-26
相关资源
最近更新 更多