0

我只想使用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

... 像这样。

谢谢。

4

2 回答 2

4

尽管 的存储值为i3 位,但当您将其用于 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)));

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

于 2013-05-18T08:54:03.690 回答
1

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

要将其限制为 3 位,您需要按位and运算才能应用位掩码:

~variable & 7
于 2013-05-18T08:52:17.810 回答