【问题标题】:A number which is just the odd (or even) bits of another number一个数字,它只是另一个数字的奇数(或偶数)位
【发布时间】: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) 次按位运算?

【问题讨论】:

标签: integer bit-manipulation


【解决方案1】:

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

对于给定的 k,您仍然需要对每个处理的位模式进行 O(n_bits) 次操作,构建表需要一些开销。但是,如果您多次执行此操作,使用查找表可能仍然比一次执行一次更有效。

【讨论】:

  • 我喜欢你的想法。我需要完成同样的事情,只是我必须对 N 个单独的通道进行非交错处理,其中 n 可以在 2 到 1000 之间变化! (我正在使用 BigInegers。)
猜你喜欢
  • 2015-05-31
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2022-10-01
  • 2021-03-30
  • 2022-12-04
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多