• 计算十进制数转化成二进制时1的个数


    #include <iostream>
    
    using namespace std;
    
    int func(int x)
    {
        int cnt = 0;
        while (x)
        {
            cnt++;
            x = x&(x - 1);
        }
        return cnt;
    }
    
    int main()
    {
        cout << func(9999) << endl << func(8);
        cin.get();
        return 0;
    }

    输出8,1

    其实上面那个函数输出结果是:形参x转化为二进制后包含1的个数。

    这样考虑:从右向左看,每次while循环,执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,直至x值为0。

    如:8的二进制位1000,8-1二进制为0111,它们&的结果直接为0了。

    如:二进制101000,减一是100111,它们&结果是100000,然后对100000循环一次就是0,退出了,共累加了2次。

     ------------------------------------------------------------------------------------------------------------------------------------------------------

    总结:

    1:由十进制看到二进制并用这样的方法计算其中1的个数真帅!

    2:对于负数,C/C++中,非零数表示真(true),零表示假(false),其实也就0的二进制全部是0,所以也会进入循环,并且也是计算其二进制中1的个数。比如func(-1)返回的是32.下面的程序输出4,32.

      我的机器int是4字节,32位,-1在机器中表示为1111...........111(共32个),(不确定是不是补码表示法...)

    #include <iostream>
    
    using namespace std;
    
    int func(int x)
    {
    	int cnt = 0;
    	while (x)
    	{
    		cnt++;
    		x = x&(x - 1);
    	}
    	return cnt;
    }
    
    int main()
    {
    	cout <<sizeof(int)<<endl<< func(-1);
    	cin.get();
    	return 0;
    }
    
  • 相关阅读:
    EXT性能优化(转载)
    xampp 下配置mail()函数发邮件
    从存储过程中返回结果 (转载)
    HDU1394 Minimum Inversion Number
    HDU4414 Finding crosses
    POJ1328 Radar Installation
    HDU3308 LCIS
    POJ2352 Stars
    POJ2513 Colored Sticks
    HDU4027 Can you answer these queries?
  • 原文地址:https://www.cnblogs.com/jiayith/p/3730981.html
Copyright © 2020-2023  润新知