【问题标题】:Reverse Value using Not Operator使用 Not 运算符反转值
【发布时间】:2013-05-18 08:47:16
【问题描述】:

我只想使用NOT ( ~ ) 运算符反转整数的二进制值,但是当我这样做时

struct rev
{
        unsigned i:3;  //for only 3 bits means 000 to 111
};
r.i = 5;

printf(" Reverse of %d  =  %u  \n",r.i,~(r.i));

它给了我Reverse of 5 = 4294967290

但我想要Reverse of 5 = 2,因为我使用的是 3 位,所以如果我不这样做,那么 5 将更改为 2,但它没有像这样显示,它给我的结果是 fffffffa 我不知道为什么.

意味着我想要的是仅通过 NOT 运算符交换 1 和 0。 我想要

0   -   7
1   -   6
2   -   5

...像这样。

谢谢。

【问题讨论】:

  • C 中没有 unsigned:3 类型,所以 ~r.i 不会只反转 3 位。
  • 那么如何只反转3位??
  • syam 和 Matt 都已经给你答案了。您不仅可以反转 3 位,还可以通过屏蔽或截断获得等价的。
  • 请意识到,c/c++ 的代码被编译成汇编并由处理器执行。没有什么比 3bit 操作...

标签: c++ c operators


【解决方案1】:

虽然i 的存储值是 3 位,但当您在 ​​C 或 C++ 中使用它进行计算时,它会提升为全尺寸(在本例中为 32 位)。

您可以通过以下方式解决:

rev r;
rev s;

r.i = 5;
s.i = ~r.i;

printf(" Reverse of %d  =  %u  \n",r.i,s.i);

编辑:您可以编写一个提供uint3 的类:

class uint3
{
  private:
     unsigned val;
     enum { mask = 7; };
  public:
    uint3(unsigned int v = 0) { val = v & mask; }
    uint3 operator=(uint3 v) { val = v.val; return *this; }
    operator int() { return val; }
};

uint3 operator~(uint3 v) { return uint3(~(int)v); }

uint3 r = 5;
printf(" Reverse of %d  =  %u  \n",(int)r, (int(~r)));

我还没有编译上述内容,但有一些类似的内容。

【讨论】:

  • 这个没问题,但为什么我们需要第二个结构?
  • 通过使用第二种结构,我们强制将结果存储为 3 位。否则,它将成为原始 3 位值的 32 位倒数。
  • 有没有其他方法可以强制将结果存储为3位??
【解决方案2】:

operator~ 反转 unsigned 值的所有位(通常是 32 位整数)。

要将其限制为 3 位,您需要按位进行 and 操作以应用位掩码:

~variable & 7

【讨论】:

  • 但是我们没有运算符来反转位,那么为什么我们这样做 AND 与 7.
  • @goodies: operator~ 不能只对 3(或 5)位进行操作,为了工作,它必须使用完整的整数。如果您计划更改位域大小,您可以使用 MatPetersson 的解决方案(将提升的值存储回您的结构中强制 and 在幕后)或为同一结构中的位掩码定义一个静态常量,以便您不要'代码中的任何地方都没有魔法值(例如 7)。
猜你喜欢
  • 2016-04-30
  • 2010-11-22
  • 2020-08-09
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
相关资源
最近更新 更多