如何实现这种按位操作?

时间:2016-06-30 10:35:40

标签: c++ logic bit-manipulation

我有一个有一定价值的整数类型。例如。说一些int foo有位代表:

11011001101101011010101000001111

我需要一个函数f来操作它,如下所示:前置0使其成为

011011001101101011010101000001111(*)

为了获得我需要的最终值,产生以下比特序列,只要(*)的连续比特不相等,就会有一个比特序列。

10110101011011110111111100001000

f(foo)

如何在c ++中实现?

1 个答案:

答案 0 :(得分:4)

简短:解决方案

unsigned f(unsigned x)
{
  return x ^ (x >> 1U);
}

简要说明:

您需要按位比较某些数字,如果位不同则为1,否则为0。这正是^操作的作用。

此外,您需要将i - 数字与(i+1) - st(和31 - st位与0)进行比较,但{{1}比较^ - 一些数字的位。因此,我们应该以这样的方式转换数字,使其位于i的第(i+1)位置,并在最开始添加i。这正是0操作所做的。

另外,请提及

>>

无法在所有情况下正常运行,因为负数int f(int x) { return x ^ (x >> 1); } 数字(所有以int开头的数字)在向右移动时会在开头获得1