即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

数字逻辑练习题

编程语言 Yangssenleo 8℃ 0评论
本文目录
[隐藏]

1.题目描述

原码、反码、补码都是一样的,都是正数本身。





对于负数:


原码是符号位为1,数值部分取绝对值的二进制。


反码是符号位为1,其它位是原码取反。


补码是符号位为1,其它位是原码取反,未位加1。





输入一个64bit十进制整数,输出它的原码,反码,补码的16进制表示法

2.输入

有多组数据,每组数据一行,为一个64bit十进制整数,包含正负符号和数值,格式见样例。


输入保证有唯一原码,反码,补码对应。




3.输出

每组输出三个16进制数,分别为原码,反码,补码。


4.样例输入

+1
-1
+10086
-2333333

5.样例输出

0x0000000000000001
0x0000000000000001
0x0000000000000001
0x8000000000000001
0xfffffffffffffffe
0xffffffffffffffff
0x0000000000002766
0x0000000000002766
0x0000000000002766
0x8000000000239a95
0xffffffffffdc656a
0xffffffffffdc656b

6.提示

计算机中-0会存在

思路:这个题直接根据码制转化输出结果即可,比赛的时候傻傻的写了模拟。 

          注意负数在计算机中是以补码形式存在的,负数的反码等于补码-1,原码等于反码按位取反。

代码:

#include 
#include 
#include 
#include 
using namespace std;
const int N = 1000 + 10;
string s;
int main()
{
    while ( cin >> s )
    {
        long long  x = 0;
        for (int i = 1;i < s.size(); i++)
        {
            x = (long long)(x * 10 + s[i] - '0');
        }
        if ( s[0] == '-' ) x = -x;
        if ( x > 0)
        {
            printf("0x%016llx\n", x);
            printf("0x%016llx\n", x);
            printf("0x%016llx\n", x);
        } else{
            printf("0x%016llx\n",  ((long long)1<<63) - x );
            printf("0x%016llx\n", x - 1);
            printf("0x%016llx\n", x);
        }
    }


    return 0;
}








转载请注明:CodingBlog » 数字逻辑练习题

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情