用于获得NOT值的优化位操作
optimized bit manipulation for getting the NOT value
我有一个无符号的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;
}
相关文章:
- 对字符串进行位操作
- 对字符数组中的元素执行逐位操作
- 逐位操作的隐式类型转换
- 如何进行特定的位操作?
- C++避免位操作完全移位
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- 使用位操作优化检查
- 子集相关位操作
- 使用 c++ 提升库的按位操作
- 位操作和异或
- 位操作将最左侧的设置位转换为右侧交替位?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- POD 类型的原子按位操作
- 如何使用位操作在单个整数中编码和解码两个数字
- __int128的位操作
- 使用位操作会影响内存消耗?
- 在具有位操作的函数中获得值
- C/C 位操作不会导致预期输出
- 用于获得NOT值的优化位操作
- 优化块位操作:以4为基数的数字