我只想使用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我不知道为什么。
意思是我想要的是1号和0号交换,只通过NOT运算符。
我想要
0   -   7
1   -   6
2   -   5

... 这样地。
谢谢。

最佳答案

虽然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)));

我还没有汇编上面的内容,但大致是这样的。

10-06 12:42