比特交换O(logN)?

时间:2016-06-11 09:17:00

标签: algorithm bit-manipulation bit

我被告知以分而治之的方式反转整数位(即首先交换每两个连续位,然后交换2位对,依此类推,直到我得到结果)是O(logN),但我没看到它是如何O(logN)..

考虑交换字节(8位)时的情况:我们首先将每两位交换并执行4次交换,然后我们交换2位对,这样我们就有2次交换,然后我们在最后一次交换中将所有内容连接在一起。总计:7次掉期,log(N)为3次。

我是对的还是我错过了什么?

2 个答案:

答案 0 :(得分:6)

关键的观察是一些交换可以并行完成。引用你的帖子:

  • 我们首先将每两位交换并执行4次交换,
  • 然后我们交换2位对,所以我们有2个交换
  • 然后我们在最后一次交换中将所有内容连接在一起。

总计:7次掉期,log(N)为3次。

是的,它是7次掉期,但是按照上面列出的3个步骤进行。

例如,交换4对就像x = ((x & 01010101b) << 1) | ((x >> 1) & 01010101b)。这样,我们取位0,2,4和6并将它们提升到位置1,3,5和7(左半部分),同时取位1,3,5和7并将它们降级到位置0,2分别为4和6(右半)。

答案 1 :(得分:4)

你只是在计算别的东西。如果你将所有&#34;个人互换&#34;加起来,那就是很多互换。但是该技术(以及许多类似技术)的重点在于,对于&#34;阶段&#34;,该阶段中的所有交换都以恒定的步数发生。例如,步骤&#34;交换相邻位&#34;:

x = ((x & 0x55) << 1) | ((x & 0xAA) >> 1);

..或其等效的delta-swap公式,看起来无论它做了多少次交换(当然常数都在变化)。所以,那是一个恒定的步骤。 (提示抱怨N位整数的操作不是单步,这里它们是,它只是一种不同的计数方式)

需要3个delta-swaps(或上面的简单交换)来反转一个字节。