这里提供两种方法
①
int NumberOf1(int n)
{
int count = 0;
int i = 0;
for ( i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
{
count++;
}
}
return count;
}
//写一个代码求一个整数二进制位上的1的个数
int main()
{
int n = 15;
int ret = NumberOf1(n);
printf("ret = %d\n", ret);
return 0;
}
原理解释:
按位与 1 &
以15为例
00000000000000000000000000001111 ---15
00000000000000000000000000000001 ---1
00000000000000000000000000000001 ---1每&一次之后>>移动一位
对于一个数的二进制位,将其与1的二进制位进行按位&,若得到的结果也为1,则将计数器加上以1。
每&一次之后,将该数的二进制位向右移动一位,以便对下一位进行判断是否为1。
②
int NumberOf1(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
//写一个代码求一个整数二进制位上的1
int main()
{
int n = 15;
int ret = NumberOf1(n);
printf("ret = %d\n", ret);
return 0;
}
原理解释:
以15为例,
这里为了简短一点只写出一个字节的表示
15的二进制位为00001111
按照这个规律:n = n & (n - 1)进行运算,n 和 n -1 进行按位&,直至n为0
//1111 n
//1110 n - 1
//1110//1110 n
//1101 n - 1
//1100//1100 n
//1011 n - 1
//1000//1000 n
//0111 n - 1
//0000
以上就是两种方法进行求一个整数二进制位上1的个数的解释,有什么问题还请大佬在评论区指出,谢谢!