zoukankan      html  css  js  c++  java
  • 面试题10:二进制中1的个数

    方法一:判断整数二进制表示中最右边一位是否为1,接着把整数右移一位判断倒数第二位是否为1,以此类推,直到整数变成0为止。

    代码:

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
     int CountOf1(int n)
     {
     	int nCount = 0;
     
     	while (n)
     	{
     		if (n & 1)
     		{
     			nCount++;
     		}
     
     		n = n >> 1;
     	}
     
     	return nCount;
     }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout << CountOf1(7) << endl;
        system("pause");
    	return 0;
    }
    
    

    缺点:如果输入的数为负数,若一直做右移运算,最终将陷入死循环


    方法二:为避免陷入死循环,可以不右移输入的数字,先将输入数字和1做与运算,判断最低位是否为1,接着将1左移一位,判断倒数第二位是否为1,以此类推。

    代码:

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
     int CountOf1(int n)
     {
     	int nCount = 0;
     	unsigned int flag = 1;
     	while (flag)
     	{
     		if (n & flag)
     		{
     			nCount++;
     		}
     
     		flag = flag << 1;
     	}
     
     	return nCount;
     }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout << CountOf1(7) << endl;
        system("pause");
    	return 0;
    }
    
    

    缺点:循环次数等于整数二进制的位数,32为的整数需要循环32次。


    方法三:把整数减去1,在和原整数做与运算,会把整数最右边的一个1变成0,那么一个整数的二进制表示中有多少个1,就可进行多少次这样的操作。显然可以减少循环次数。

    代码:

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    int CountOf1(int n)
    {
    	int nCount = 0;
    
        while (n)
        {
    		nCount++;
    		n = n & (n -1);
        }
    
    	return nCount;
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout << CountOf1(7) << endl;
        system("pause");
    	return 0;
    }
    
    



  • 相关阅读:
    互斥锁属性
    Linux线程属性总结
    Linux 线程调度与优先级
    [置顶] 自旋锁和互斥锁的区别
    C语言中的未初始化变量的值
    在液晶屏里显示浮点数的方法 (sprintf 的妙用)
    消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
    在链表尾部添加数据
    Android 之 Matrix(转)
    Android退出应用最优雅的方式(改进版)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3202803.html
Copyright © 2011-2022 走看看