使用非运算符的反向值

时间:2013-05-18 08:47:16

标签: c++ c operators

我只是想使用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位,所以如果我将使用NOT,那么5将被更改为2,但它没有显示为这样,它给了我fffffffa的结果我不知道为什么。

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

0   -   7
1   -   6
2   -   5

......喜欢这个。

感谢。

2 个答案:

答案 0 :(得分:4)

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

我没有编译上面的内容,但是有些内容。

答案 1 :(得分:1)

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

要将此限制为3位,您需要按位and操作才能应用位掩码:

~variable & 7