Скажем, у меня есть 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) количество побитовых операций?