优化布尔蒙版分配

时间:2016-10-12 04:13:23

标签: c bit-manipulation bitwise-operators boolean-logic

此问题在性质上类似于:Is -!(condition) a correct way to obtain a full-bitvector from a boolean (mask-boolean)?

作为硬件解决方案的一部分,我想实施一个条件检查并随后分配所有" 1"或" 0"位到32位int。

我的代码是:value & ~(!(x & y) - 1)。如果x和y位之间存在一些重叠,则将值设置为0,否则保留值。

我的问题是如何优化此语句以减少所涉及的运算符数量。这是否可以仅使用一元和二进制整数运算! ~ & ^ | + - * / % << >>

这是我的代码供一些参考,它重复x到字长的低位n位:

int bitRepeat(int x, int n) {
/* Mask desired bits, shift and OR by larger intervals each time, return repeated pattern */    

/* Check for n = 32, set a to all 1's if n != 32 */ 
int nMax = ~(!(n & 31)-1);  

/* Mask low-order n bits */
int maskBits = ~(~0 << n) & x;  

/* Initialize shift factors */  
int n2 = n * 2; 
int n4 = n * 4; 
int n8 = n * 8; 
int n16 = n * 16;

/* Shift and OR masked bits by intervals n * x {x: 1,2,4,8,16}, check for overflow at each step */  
int overFlowMask = ~0 << 5;
maskBits = maskBits | maskBits << n;
maskBits = maskBits | ((maskBits << (n2)) & ~(!((n2) & overFlowMask) - 1));
maskBits = maskBits | ((maskBits << (n4)) & ~(!((n4) & overFlowMask) - 1));
maskBits = maskBits | ((maskBits << (n8)) & ~(!((n8) & overFlowMask) - 1));
maskBits = maskBits | ((maskBits << (n16)) & ~(!((n16) & overFlowMask) - 1));

return (maskBits & ~nMax) | (x & nMax);
}

以某种身份实施unsigned数据会有帮助吗?

1 个答案:

答案 0 :(得分:0)

你可以更容易地做到这一点(我们想要用n个重复的位模式填充一个整数)。

unsigned int bitRepeat(unsigned int x, int n)
{
   unsigned int answer = 0;

   while(x)
   {
     answer |= x;
     x <<= n;
   }

   return answer;
}

您需要使用无符号整数,因为移出有符号整数的MSB会产生不可预测的后果。 (因为编译器可能会 优化到x * = poweroftwo,并设置算术溢出陷阱。

由于你不能使用循环,因此变得有点困难。就像你一样 观察到,如果整数是32位,那么最坏的情况是我们加倍 缓冲五次。

所以

int bitRepeat(int x, int n)
{
   unsigned int rack = x;

   rack = (rack << n) | rack;
   n *= 2;
   rack = (rack << n) | rack;
   n *= 2;
   rack = (rack << n) | rack;
   n *= 2; 
   rack = (rack << n) | rack;
   n *= 2;
   rack = (rack << n) | rack;

   return rack;
}

不幸的是,如果转变,这在技术上是未定义的行为 高于整数的大小。您的编译器可能会接受它。但如果没有条件限制就很难抑制。