一个数字,它只是另一个数字的奇数(或偶数)位
Posted
技术标签:
【中文标题】一个数字,它只是另一个数字的奇数(或偶数)位【英文标题】: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) 次按位运算?
【问题讨论】:
有一种快速的方法可以与您所要求的相反:graphics.stanford.edu/~seander/… 【参考方案1】:您可以预先计算一些 k 位宽的查找表(k 类似于 4、8 或 16)保存查找索引的“奇数”和“偶数”位,然后进行 n/k 表查找和通过移位和遮罩重新组装它们。
对于给定的 k,您仍然需要对每个处理的位模式进行 O(n_bits) 次操作,构建表需要一些开销。但是,如果您多次执行此操作,使用查找表可能仍然比一次执行一次更有效。
【讨论】:
我喜欢你的想法。我需要完成同样的事情,只是我必须对 N 个单独的通道进行非交错处理,其中 n 可以在 2 到 1000 之间变化! (我正在使用 BigInegers。)以上是关于一个数字,它只是另一个数字的奇数(或偶数)位的主要内容,如果未能解决你的问题,请参考以下文章
找出区间[A, B]内所有数字的奇数字位出现次数为偶数,偶数字位出现次数为计数的数的个数。(数位DP)