大家好,又见面了,我是全栈君
题目:请实现一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
// 计算整数的二进制表示中1的个数
int CalcOneNumInBinary(int nVal)
{
int nCount = 0;
while (nVal > 0)
{
if (1 == (nVal & 1))
{
nCount ++;
}
nVal = nVal >> 1;
}
return nCount;
}
PS:右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。 如果数字原先是一个正数,则右移之后在最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1。例如下面对两个八位二进制数进行右移操作: 00001010>>2=00000010 10001010>>3=11110001 那么,问题来了:上面的方法如果输入一个负数,比如0x80000000,如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环。
为了避免死循环,我们可以不右移输入的数字i:
(1)首先把i和1做与运算,判断i的最低位是不是为1。
(2)接着把1左移一位得到2,再和i做与运算,就能判断i的次低位是不是1。
(3)这样反复左移,每次都能判断i的其中一位是不是1。
int CalcOneNumInBinary_1(int nVal)
{
int nCount = 0;
int nFlag = 1;
while (nFlag > 0)
{
if ((nVal & nFlag) > 0)
{
nCount ++;
}
nFlag = nFlag << 1;
}
return nCount;
}
int NumberOf1Solution3(int n)
{
int count = 0;
while (n > 0)
{
count++;
n = (n - 1) & n;
}
return count;
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120167.html原文链接:https://javaforall.cn