1. 统计二进制数中1的个数
public static int GetOneNums(int n)
{
n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff);
n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);
return n;
}
- 时间复杂度:O(logk),k 为
int
的位数,固定为 32 位 - 空间复杂度:O(1)
2.获取二进制数的个数(从最高位为1开始算)
internal static int GetNums(int x)
{
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
x -= ((x >> 1) & 0x55555555);
x = ((x >> 2) & 0x33333333) + (x & 0x33333333);
x = (((x >> 4) + x) & 0xF0F0F0F);
x += x >> 8;
x += x >> 16;
return x & 0x3F;
}