说奇(甚至)位,我有一些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
有没有更有效的方式来做到这一点,利用说恒定或登录位操作(n_bits)是多少?
有一种快速的方法来做你所问的对象:http://graphics.stanford.edu/~seander/bithacks.html#InterleaveTableObvious – 2012-03-27 00:44:04