【问题标题】:How to implement this bitwise manipulation?如何实现这种按位操作?
【发布时间】:2016-06-30 10:35:40
【问题描述】:

我有一个具有某些值的整数类型。例如。说一些int foo 有位表示:

11011001101101011010101000001111

我需要一个函数 f 来操作它,如下所示:在前面加上 0 就可以了

011011001101101011010101000001111 (*)

为了获得我需要的最终值,创建了以下位序列,当 (*) 的连续位不相等时,该位序列为 1。

10110101011011110111111100001000

这是f(foo)

这应该如何在 c++ 中实现?

【问题讨论】:

  • 我不明白?设置为第一个值的足够大的容器是否已经预先添加了零?
  • @erip 为什么不呢?它确实...
  • 你的意思是增量编码吗?
  • 我数 32 位是我对某些东西视而不见还是您被禁止使用 64 位整数?
  • @deviantfan 啊我需要咖啡...评论已删除。

标签: c++ logic bit-manipulation


【解决方案1】:

简短:解决方案是

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

简要说明:

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

此外,您需要将数字的i-th 位与(i+1)-st (以及31-st 位与0)进行比较,但^ 比较i-th 位一些数字。因此,我们应该以这样一种方式转换数字,使其从(i+1)-st 位置到i-th 位置,并在一开始添加0。这正是>> 操作的作用。

另外,请提及

int f(int x)
{
  return x ^ (x >> 1);
}

不适用于所有情况,因为负数 int (所有以 1 开头的数字)在右移时将在开头得到 1

【讨论】:

  • 接吻。 +1 正在输入这个 - 你秒杀我。 :)
  • 大声笑...我知道我忘记了什么:D
猜你喜欢
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多