当我尝试不同的代码排列时,我会得到奇怪的输出。
int ret = (xCopy ^ x);
return ret;
// returns -1[0xffffffff]
===============
int ret = !(xCopy ^ x);
return ret;
// returns 1[0x1]
不应该!( - 1)是0?
...的确
int ret = !(-1);
return ret;
// returns 0[0x0]
=============
int ret = !(0xFFFFFFFF);
return ret;
// returns 0[0x0]
// x = 0x80000000 and n=0x01
int fitsBits(int x, int n) {
// Grab the sign bit.
int signBit = (x >> 31) & 0x01;
// Truncate down to n bits.
int xCopy = x << (32-n);
// Set the MSB to 0.
int msb = (xCopy >> 31) & 0x01;
int msbMask = ~(0x01 << 31);
xCopy = xCopy & msbMask;
// Shift back to word.
xCopy = xCopy >> (32-n);
// Restore the MSB
int restoreMask = msb << (32-n);
xCopy = xCopy | restoreMask;
// Restore the sign bit.
int signBitMask = signBit << 31;
xCopy = xCopy | signBitMask;
return !(xCopy ^ x);
}
答案 0 :(得分:0)
我认为您需要提供xCopy
和x
刚试过,它在我的环境中有效:
int x=1;
int xx=0xfffffffe;
int a = !(xx ^ x);
cout<<a<<endl; // outputs 0
答案 1 :(得分:0)
请提供您的输入值。
我尝试使用这些值并且工作正常。
void main()
{
int t1, t2;
int xCopy, x;
xCopy = 0xAAAAAAAA;
x = 0x55555555;
t1 = xCopy ^ x;
printf("%d\n", t1); //Gives -1 as expected
t2 = !(xCopy ^ x);
printf("%d\n", t2); //Gives 0 as expected
}
您的新代码对我来说很好。根据您的代码和输入,在功能结束时,!(xCopy ^ x)
xCopy
和x
的值均为0x80000000。
所以(xCopy ^ x)
对我来说是0。 !(xCopy ^ x)
与预期的一样。