我只是想使用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
......喜欢这个。
感谢。
答案 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