【问题标题】:Rotating every 3 bits of integer in C++ [closed]在 C++ 中每 3 位整数循环 [关闭]
【发布时间】:2019-12-12 19:19:31
【问题描述】:

请注意,如果 x 是任何正整数,以下可能具有完全相同的解决方案,但对于手头的确切问题:

选择一个整数 0 http://oeis.org/A308496 )。令 y 是通过将 x 的每个 3 位子串向左旋转 1 形成的整数。例如。如果 (x)_2 = 001_010_111_100 然后 (y)_2 = 010_100_111_001

问题:让 x_1, x_2, ... x_m 是给定 n 的此类 x 的序列,找到对应的 y_1, y_2, ... y_m。

如果 m 小于几千,那么速度就不是问题了。一个可以例如将“001_010_111_100”分解为数组 [001, 010, 111, 100] 并对数组的每个元素执行位轮换。

然而,一旦 m 变得相当大(例如 > 10^6),这个任务就需要尽可能的优化。有什么建议(给 C++ 初学者)?

【问题讨论】:

  • 这是家庭作业还是其他学校作业?
  • 您对如何解决这个问题有什么想法?
  • 没有作业,我正在处理图像 - 因此有数百万个条目。我会为大家省去细节。
  • 构建一个长度为 256 的转换数组,将一个字节转换为另一个字节。也许一个长度为 16 的数组来转换半字节,由于各种缓存的工作方式,效率更高。可能是。做一个测试。
  • 为了获得最佳性能,解决方案可能在于一些汇编程序魔法(MMX、SSE、FMA;我只是在没有任何技术知识的情况下在这里抛出首字母缩略词)。

标签: c++ algorithm performance bit-manipulation


【解决方案1】:

一个基本的方法是使用与通常相同的逻辑进行旋转,所以:

左移

ABC_DEF_GHI in
BCD_EFG_HI0 out

右移

ABC_DEF_GHI in
00A_BCD_EFG out

这些字段相互渗透,但那是被重组无论如何都丢弃的部分:

条件选择

BCD_EFG_HI0
110_110_110
00A_BCD_EFG
001_001_001
-----------
BCA_EFD_HIG

所以总的来说((x << 1) & 0b110110110) | ((x >> 2) & 0b001001001)

【讨论】:

  • 这绝对是比我更好的方法——非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 2013-12-17
  • 2020-10-06
  • 2017-04-01
  • 2014-08-10
相关资源
最近更新 更多