c - 优化 bool 掩码分配

标签 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某些容量的数据有帮助吗?

最佳答案

你可以更容易地做到这一点(我们想要用位模式的 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;
}

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

关于c - 优化 bool 掩码分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39990412/

相关文章:

c - 如何创建指向二维字符数组的指针,然后打印输出

c - 对我声明的函数的 undefined reference

javascript - 我不明白 "write an uint32 inside an array in javascript"的代码是如何工作的

c - 为什么这个按位运算符返回负数?

python - 使用管道将数据从 C 进程发送到 Python 进程

c - 相当简单的 C 代码中的安全漏洞

c - 确定设置了字节中的哪一位

python - Redis 在位数组上的性能

java - 为这些类型的字节级操作进行 Java 编码的最佳方法是什么?

java - 不明白这些按位运算符如何对字节和整数进行操作