一个数字,它只是另一个数字的奇数(或偶数)位

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。)

以上是关于一个数字,它只是另一个数字的奇数(或偶数)位的主要内容,如果未能解决你的问题,请参考以下文章

1295. 统计位数为偶数的数字

在数字列表中查找下一个奇数或下一个偶数

找出区间[A, B]内所有数字的奇数字位出现次数为偶数,偶数字位出现次数为计数的数的个数。(数位DP)

C ++根据偶数或奇数将单词放入堆栈

使用开关函数c ++输入正整数或负整数列表以查明数字是偶数还是奇数

判断数字是否为奇数或偶数