如何仅使用<<来编写C程序>> + | &安培; ^〜! =
这会计算给定整数中的1的数量吗?
答案 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];
}
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的补码架构。
如果您无法使用if
,for
或while
语句,并行总和就会这样:
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?