64位二进制补码(unsigned)

文章讲述了小新在学习C语言时遇到的问题,关于double类型数据的小数精度限制,以及在64位二进制补码表示下计算1的个数。通过例子展示了0.1的二进制无限循环形式,指出在有限位数表示时可能出现的精度误差。此外,文中提到使用无符号定义(unsigned)来正确处理负数的补码表示。
摘要由CSDN通过智能技术生成

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


做题过程:

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


代码实现:

#include<bits/stdc++.h>
using namespace std;
void solve()
{
     unsigned long long n;
    while(cin>>n)
    {
        int sums=0;
        while(n)
        {
            if(n&1)sums++;
            n>>=1;
        }
        cout<<sums<<'\n';
    }
}
  int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    while(t--)
    solve();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值