我有一个有一定价值的整数类型。例如。说一些int foo
有位代表:
11011001101101011010101000001111
我需要一个函数f
来操作它,如下所示:前置0使其成为
011011001101101011010101000001111(*)
为了获得我需要的最终值,产生以下比特序列,只要(*)的连续比特不相等,就会有一个比特序列。
10110101011011110111111100001000
是f(foo)
如何在c ++中实现?
答案 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
。