假设我有一些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)个按位运算?
答案 0 :(得分:2)
您可以预先计算一些k位宽的查找表(k为4,8或16),保存查找索引的“奇数”和“偶数”位,然后进行n / k表查找和用移动和遮蔽重新组装它们。
对于给定的k,对于每个处理的位模式,仍然需要O(n_bits)运算,并且需要一些开销来构建表。但是如果你多次进行这种操作,那么使用查找表可能仍然会更有效,而不是一次只做一次。