计蒜客 补码 模拟题

网友投稿 990 2022-11-06

计蒜客 补码 模拟题

计蒜客   补码  模拟题

在计算机中,整数是用二进制补码存储的,与之相关的还有原码、反码这两个概念,这里蒜头君为大家做一个简单的介绍。

无论原码、反码还是补码,第一位都是符号位,当第一位为 00 时,表示非负数;反之表示负数。

原码:除符号位外,余下位上的数为原数的绝对值(注意,这里是二进制)。

反码:非负数的反码就是其本身;负数的反码是在原码的基础之上,符号位不变,余下的所有位取反。

补码:非负数的补码就是其本身;负数的补码就是在反码的基础之上 +1+1。

我们通过如下几个例子来进一步理解原码、反码和补码:

十进制数 原码 反码 补码 8585 0101 0101 0101 0101 0101 0101 -85−85 1101 0101 1010 1010 1010 1011 99 0000 1001 0000 1001 0000 1001 -9−9 1000 1001 1111 0110 1111 0111 不过蒜头君今天想让你尝试计算的不是 88 位的补码,而是 3232 位的补码,因为int是 44 字节 3232 位的。3232 位的补码是最高一位为符号位,剩下 3131 位是跟数的大小有关的。

蒜头君会把一个 3232 位补码给你,让你帮忙算一下它对应的十进制数是多少。

输入格式

输入第一行,包含一个仅有’0’, '1’组成的字符串,且长度为 3232 。

输出格式

输出一行,包含一个整数,表示这个补码对应的十进制数。

数据范围

对于 60%60% 的数据,补码最高位为’0’。

对于 100%100% 的数据,字符串仅由’0’, '1’组成,且长度为 3232 。

输出时每行末尾的多余空格,不影响答案正确性 样例输入1 复制 00000000000000000000000001010101 样例输出1 复制 85 样例输入2 复制 11111111111111111111111110101011 样例输出2 复制 -85 思路:一开始将补码想麻烦了,反码换补码,只用结果+1即可。 直接按题意模拟即可。

#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long#define N 100010using namespace std;const int maxn = 100000 + 5;char a[maxn];int main() { scanf("%s",a);//0为正 int n = strlen(a); n--; ll sum=0; if(a[0] == '0') { n--; for(int i = 1; i < strlen(a); i++) { { if(a[i] == '0') { n--; continue; } if(a[i] == '1') { sum += pow(2, n); n--; } } } } else if(a[0] == '1') { n--; for(int i = 1; i < strlen(a); i++) if(a[i] == '0') a[i] = '1'; else a[i] = '0'; for(int i = 1; i < strlen(a); i++) { if(a[i] == '0') { n--; continue; } if(a[i] == '1') { sum += pow(2, n); n--; } } } if(a[0]=='1') printf("-%lld\n",sum+1); else printf("%lld\n",sum); return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:计蒜客入门赛#2 数列 一次前缀和+二分区间(lower_bound)
下一篇:B. Minesweeper 思维 二种思路
相关文章

 发表评论

暂时没有评论,来抢沙发吧~