我有一个无符号的16位数字,a,我需要得到~a的值。简单地取〜的值是行不通的(对于a = 10,我需要~a = 5,而不是~a = 7FF5)。 我能想到的最好的是:
int negate(int a)
{
int mask1 = 0x4000;
int mask2 = 0x7FFF;
for (int i=0;i<15;i++)
{
if (!(a&mask1))
{
mask1>>=1;
mask2>>=1;
}
else
break;
}
int t = (0x7FFF - ~a) & mask2;
return t;
}
问题在于它太慢了;你知道更快的方法来获得我需要的结果吗?
感谢您的帮助
答案 0 :(得分:6)
只是为了验证:你想要的是将所有位反转到包括所设置输入的最高有效位,但是将所有位保持为高于零的位?
如果情况确实如此,那么这里是代码:
// inspired by Hacker's Delight
unsigned significant_bits(unsigned x)
{
x |= (x >> 1);
x |= (x >> 2);
x |= (x >> 4);
x |= (x >> 8);
// x |= (x >> 16); // only needed for 32-bit integers
return x;
}
unsigned negate(unsigned x)
{
return x ^ significant_bits(x);
}
答案 1 :(得分:3)
听起来你想要~a & 0xF
。
答案 2 :(得分:2)
int negate(unsigned int a) {
if(a==0);
else if(a==1) a = 0;
else if(a<4) a ^= 0x0003;
else if(a<8) a ^= 0x0007;
else if(a<16) a ^= 0x000f;
else if(a<32) a ^= 0x001f;
else if(a<64) a ^= 0x003f;
else if(a<128) a ^= 0x007f;
else if(a<256) a ^= 0x00ff;
else if(a<512) a ^= 0x01ff;
else if(a<1024) a ^= 0x03ff;
else if(a<2048) a ^= 0x07ff;
else if(a<4096) a^= 0x0fff;
else if(a<8192) a ^= 0x1fff;
else if(a<16384) a ^= 0x3fff;
else if(a<32768) a ^= 0x7fff;
else a^=0xffff;
return a;
}
int main()
{
printf("%d",negate(10));
return 0;
}
如果你想增加32位数字的大小,你可以在分支时添加else。第一种情况
a==0; the result is a itself
a==1; the result is 0, simple assigning 0 is fine .
或者很简单,你可以把它放在一个循环中,并且每次左移一个变量说i
左移。然后返回a ^ = (i - 1) ;
答案 3 :(得分:1)
通过调用negate()
:
int negate(int a, int mask)
{
return ~a & mask;
}
执行示例:
negate(0x000A, 0x000F) == 0x0005
negate(0x000A, 0x00F0) == 0x00F0
更新
int negate(int num)
{
unsigned int bitMask = 0xFFFFFFFF;
for(unsigned int bit = 0x80000000; bit != 0; bit >>= 1)
{
if(bit & num)
break;
bitMask /= 2 ;
}
return ~num & bitMask;
}