此问题在性质上类似于: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
数据会有帮助吗?
答案 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;
}
不幸的是,如果转变,这在技术上是未定义的行为 高于整数的大小。您的编译器可能会接受它。但如果没有条件限制就很难抑制。