优化位操作以获取NOT值

时间:2013-12-01 17:16:16

标签: c++ c optimization bit-manipulation

我有一个无符号的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;    
}

问题在于它太慢了;你知道更快的方法来获得我需要的结果吗?

感谢您的帮助

4 个答案:

答案 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;
}