给定二进制数,请返回该数字的1和2的补码。
在进行编程之前,我们将研究如何获取给定二进制数的1和2的补码。
1的补语:
1的补码是通过翻转所有位来实现的。
例:
原始值1的补码
0 1
1 0
1100 0011
1111 0000
2的补码:
通过在二进制数的1的补码上加1,我们得到2的补码。
2的补数= 1的补数+ 1;
2的补码特别重要,因为它用于表示二进制的有符号(-ve)数字。正数按原样存储,但负数将以2的补数存储。
例:
原始值1的补语2的补语
10011001 01100110 +1 = 01100111
那么2的补码如何用于表示–ve数?
例如,我们采用-5以二进制格式表示它。
将5转换为二进制格式“ 00000101”
1的补码为“ 11111010”,然后为2的补码添加“ 1”。
2的补码“ 11111011”
要将其重新计算为十进制:
-128 + 64 + 32 + 16 + 8 + 2 +1 = -5
好的,现在回到我们的问题:
为了得到1的补码,我们将位翻转。
要获得2'c补码,请将所有1都翻转为0,直到遇到第一个0,然后再将0翻转为1。
例:
二进制数是1100
那么1的补码就是0011
对于2的补码:
步骤1:将所有1翻转为0,即:“ 0000”
步骤2:然后将第一个出现的0翻转为1,因为“ 0100”为2的补码。
注意:第一次出现0的是索引1的补码3。
C ++解决方案
/* * File : 上 es_twos_complement.cpp * Contact : [email protected] * Website: @ 前开发者教程.com */ #include<iostream> #include<vector> #include<string> using namespace std; char flip(char c) { if(c == '0') return '1'; else return '0'; } void get_ones_twos_complement(string str) { int len = str.size(); string 上 es ; string twos ; for(int i = 0; i <len; i++ ) { ones += flip(str[i]); } cout << "1's complement: " << 上 es << endl; twos = 上 es; int i = 0; for ( i = len - 1; i > 0; i--) { if(ones[i] == '1') twos[i] = '0'; else { twos[i] = '1'; break; } } // This case is used to handle situations like "1111" // we add extra "1" 上 the left side if (i == -1) twos = '1'+twos; cout << "2's complement: " << twos << endl; } int main() { string binary = "1100"; cout<<"Original binary number = "<<binary<<endl; get_ones_twos_complement(binary); return 0; }
输出:
Original binary number = 1100 1's complement: 0011 2's complement: 0100
该网站上可用的教程列表:
C编程20+章 | C ++编程80+章 |
100多个编码问题 | 数据结构和算法85+章 |
系统设计20+章 | Shell脚本编写12章 |
4g LTE 60+章节 | 最常见的编码问题 |
5G NR 50+章 | Linux系统编程20+章 |