一个数字,它只是另一个数字的奇数(或偶数)位

时间:2012-03-27 00:34:20

标签: integer bit-manipulation

假设我有一些128位数字n:

... 0b10010101110101010101

我想构造两个新的64位数,其中一个由n中的奇数位组成,其中一个由n中的偶数位组成。我可以通过单独屏蔽每个位并设置它来做到这一点,但我想知道是否有更快的算法。

这是我在Ruby中使用的算法:

n=0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

odds=0
evens=0
0.upto(63) do |i|
  even_mask =  1 << (2*i)
  odd_mask  =  1 << ((2*i)+1)
  pos_mask  =  1 << i
  evens = (evens | pos_mask) if (n & even_mask) != 0
  odds  = ( odds | pos_mask) if (n & odd_mask) != 0
end

puts odds.to_s(16)
>> ffffffffffffffff

puts evens.to_s(16)
>> 0

是否有更有效的方法,使用常数或log(n_bits)个按位运算?

1 个答案:

答案 0 :(得分:2)

您可以预先计算一些k位宽的查找表(k为4,8或16),保存查找索引的“奇数”和“偶数”位,然后进行n / k表查找和用移动和遮蔽重新组装它们。

对于给定的k,对于每个处理的位模式,仍然需要O(n_bits)运算,并且需要一些开销来构建表。但是如果你多次进行这种操作,那么使用查找表可能仍然会更有效,而不是一次只做一次。