用于获得NOT值的优化位操作

optimized bit manipulation for getting the NOT value

本文关键字:优化 位操作 NOT 用于      更新时间:2023-10-16

我有一个无符号的16位数字a,我需要得到~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;    
}

问题是它太慢了;你知道有什么更快的方法可以得到我需要的结果吗?

感谢您的帮助

只是为了验证:你想要的是将所有位反转到并包括设置的输入的最高有效位,但将所有高于该值的位保留为零?

如果真的是这样的话,那么下面是代码:

// 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);
}

听起来你想要~a & 0xF

 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位,你可以添加其他If分支。第一个案例

  a==0; the result is a itself
  a==1; the result is 0, simple assigning 0 is fine . 

或者简单地说,你可以把它放在一个循环中,并取一个变量,比如i,每次左移1。然后返回a ^ = (i - 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;
}