我只想使用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)));
我还没有汇编上面的内容,但大致是这样的。