64位二进制补码(unsigned)

小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有效位是有限的,但是没有告诉他这是为什么,后来他发现0.1的二进制是一个无限循环小数0.000110011001100110011001100···,如果只取27位小数,再转换成十进制的话就变成了0.09999999403953552,小新开心的解决了这个问题。与此同时,小新又有了一个新的问题:一个数在64位二进制补码表示下,一共有多少个1。因为小数有无解的情况,所以我们保证输入的都是整数。


做题过程:

自己试试用数电课上教过的求补码方式,先将负数转化为正数,然后将加一,结果WA了很多发,后面看别人的题解发现别人都加了unsigned(无符号定义),说是可以将负数转化为补码形式,然后过了。


代码实现:

#include
using namespace std;
void solve()
{
     unsigned long long n;
    while(cin>>n)
    {
        int sums=0;
        while(n)
        {
            if(n&1)sums++;
            n>>=1;
        }
        cout<

你可能感兴趣的:(算法)