仅使用<<来计算给定整数中的1的数量>> + | &安培; ^〜! =

时间:2015-04-26 10:42:01

标签: c binary bit-manipulation

如何仅使用<<来编写C程序>> + | &安培; ^〜! =
这会计算给定整数中的1的数量吗?

2 个答案:

答案 0 :(得分:1)

看看斯坦福大学的Bit Twiddling hacks。以下是您的问题的一些选择:

天真的方法

unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v

for (c = 0; v; v >>= 1)
{
  c += v & 1;
}

使用查找表

static const unsigned char BitsSetTable256[256] = 
{
#   define B2(n) n,     n+1,     n+1,     n+2
#   define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
#   define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
    B6(0), B6(1), B6(1), B6(2)
};

unsigned int v; // count the number of bits set in 32-bit value v
unsigned int c; // c is the total bits set in v

// Option 1:
c = BitsSetTable256[v & 0xff] + 
    BitsSetTable256[(v >> 8) & 0xff] + 
    BitsSetTable256[(v >> 16) & 0xff] + 
    BitsSetTable256[v >> 24]; 

// Option 2:
unsigned char * p = (unsigned char *) &v;
c = BitsSetTable256[p[0]] + 
    BitsSetTable256[p[1]] + 
    BitsSetTable256[p[2]] + 
    BitsSetTable256[p[3]];


// To initially generate the table algorithmically:
BitsSetTable256[0] = 0;
for (int i = 0; i < 256; i++)
{
  BitsSetTable256[i] = (i & 1) + BitsSetTable256[i / 2];
}

Brian W. Kernighan的方法

unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; c++)
{
  v &= v - 1; // clear the least significant bit set
}

还有一些算法,请阅读链接页面了解详细信息。

答案 1 :(得分:0)

仅使用<< >> + | & ^ ~ ! =无法做到这一点。您需要一些其他标点符号,例如{}();,您还需要一些字母。

这是一个没有数字的解决方案:

int bc(unsigned int n){int c=!&n;while(n){c++;n&=n+~!&n;}return c;}

它仅使用上面提到的运算符,但仅适用于2的补码架构。

如果您无法使用ifforwhile语句,并行总和就会这样:

int bitcount32(unsigned int x) {
    x = ((x >> 1) & 0x55555555) + (x & 0x55555555);
    x = ((x >> 2) & 0x33333333) + (x & 0x33333333);
    x = ((x >> 4) & 0x0f0f0f0f) + (x & 0x0f0f0f0f);
    x = ((x >> 8) & 0x00ff00ff) + (x & 0x00ff00ff);
    return (x >> 16) + (x & 0x0000ffff);
}

此函数适用于32位整数,但可以修改为处理16或64位整数。根据您的实际CPU性能,有更紧凑的解决方案和可能更高效的解决方案:How to count the number of set bits in a 32-bit integer?