【发布时间】:2012-03-27 00:34:20
【问题描述】:
假设我有一些 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) 次按位运算?
【问题讨论】:
-
有一种快速的方法可以与您所要求的相反:graphics.stanford.edu/~seander/…