查找字符的位总和
Find sum of bits of a char
我需要一个大小约为 8 个布尔值的队列。每次推动都应该从尾部摧毁一个项目。这可以通过在资源有限的应用程序中 char
来实现。
不过我只关心那些“旗帜”的总和,而不关心它们各自的状态。我怎样才能找到一个8位char
的集合位的总和?
我想出了两个办法
一个方法是用一个变量来统计和,每次push的时候都维护这个变量,变量的变化取决于你push什么,pop什么。
另一种方法是一种名为“lowbit”的算法
int lowbit(int x) {
return x & -x;
}
它将return x 的二进制表示的最后一个 1 int。
这样就可以得到x的二进制表示中'1'的个数
例如,这样的代码。
int sum_of_1(int x) {
int res = 0;
while (x != 0) res++, x -= lowbit(x);
return res;
}
计数位集,Brian Kernighan 的方式
// count the number of bits set in v
unsigned char sum( unsigned char 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
}
return v;
}
unsigned char push( unsigned char v, bool in )
{
v << 1;
if( in )
{
v |= 1;
}
return v;
}
我需要一个大小约为 8 个布尔值的队列。每次推动都应该从尾部摧毁一个项目。这可以通过在资源有限的应用程序中 char
来实现。
不过我只关心那些“旗帜”的总和,而不关心它们各自的状态。我怎样才能找到一个8位char
的集合位的总和?
我想出了两个办法
一个方法是用一个变量来统计和,每次push的时候都维护这个变量,变量的变化取决于你push什么,pop什么。
另一种方法是一种名为“lowbit”的算法
int lowbit(int x) {
return x & -x;
}
它将return x 的二进制表示的最后一个 1 int。
这样就可以得到x的二进制表示中'1'的个数
例如,这样的代码。
int sum_of_1(int x) {
int res = 0;
while (x != 0) res++, x -= lowbit(x);
return res;
}
计数位集,Brian Kernighan 的方式
// count the number of bits set in v
unsigned char sum( unsigned char 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
}
return v;
}
unsigned char push( unsigned char v, bool in )
{
v << 1;
if( in )
{
v |= 1;
}
return v;
}