原码、反码、补码complement

原码、反码、补码complement

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

一、原码转为反码、补码complement

1、正整数的原码、反码、补码完全一样,即符号位固定为0,数值位相同.

2、负整数的符号位固定为1,由原码变为补码时,规则如下:

  • (1)原码符号位1不变,整数的每一位二进制数位求反,得到反码.
  • (2)反码符号位1不变,反码数值位最低位加1,得到补码.

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%原码、反码、补码complement_第1张图片

原码、反码、补码complement_第2张图片

二、反码转为原码

反码转换为原码也是一样,规则如下:

  • (1)正整数:原码、反码、补码完全一样,即符号位固定为0,数值位相同.
  • (2)负整数:符号位不变,数值位分别“按位取反”,即可得到原码。

原码、反码、补码complement_第3张图片

三、补码转为原码

  已知一个数的补码,求原码 的操作分两种情况: 

  • (1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 
  • (2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。 

原码、反码、补码complement_第4张图片

例如、将补码11100111转换成原码的过程如下:

  1. 最高位是1,说明这是一个负数。将补码除符号位外的所有位取反得到反码:10011000。

  2. 在反码的基础上,将所有位加1,得到原码:10011001,即-25。

四、通过二进制补码、反码、原码求十进制数值

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 函 数 名:bin_com2dec
% 功    能:X_bin补码、反码、原码求十进制数dec
% 输入参数:
% %    1.参数X_bin:二进制的补码、反码、原码
% %    2.参数choice:1-补码;2-反码;3-原码
% 输出参数:
% %    1.参数dec:求得的十进制数
% %    2.参数flag1:
% 
% 作    者:
% 日    期:
% 版    本:
% 
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% %%%%%%% 1.matlab由X_bin补码、反码、原码求十进制数dec %%%%%%%---START--OK---%%%%%%%
% % % % 
function dec = bin_com2dec(X_bin,choice) %这里X_bin指的是二进制补码、反码、原码,最高位为符号位.
len = length(X_bin);
switch choice
    case 1 %补码按1
        p = str2double(X_bin(1))*(-1)*power(2,len-1);
        for i=2:1:len
            p = p + str2double(X_bin(i))*power(2,len-i);
        end
        sprintf('二进制补码转为十进制结果为:%d',p)
    case 2 %反码按2
        p = str2double(X_bin(1))*(-1)*(power(2,len-1)-1);
        for i=2:1:len
            p=p+str2double(X_bin(i))*power(2,len-i);
        end
        sprintf('二进制反码转为十进制结果为:%d',p)
    case 3 %原码按3
        p = 0;
        for i=2:1:len
            p = p + str2double(X_bin(i))*power(2,len-i);
        end
        p = p*power(-1,str2double(X_bin(1)));
        sprintf('二进制原码转为十进制结果为:%d',p)
    otherwise %其他
        errordlg('ERROR');
end
dec = p;
end
% %%%%%%% 1.matlab由X_bin补码、反码、原码求十进制数dec %%%%%%%-----END-----%%%%%%%

调用 bin_com2dec 函数

X_bin = '1111111101111100';
choice = 1; %补码

dec = bin_com2dec(bin_data{i},choice);
sprintf('二进制补码转为十进制结果为:%d', dec)

结果为:

ans =

    '二进制补码转为十进制结果为:-132'

在计算机系统中,数值一律用补码来表示(存储)。 

主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 

补码与原码的转换过程几乎是相同的。 

数值的 补码表示 也分两种情况: 

  • (1)正数的补码:与原码相同。 

                例如,+9的补码是00001001。 

  • (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 

      例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码   0000111按位取反为1111000;再加1,所以-7的补码是11111001。 

已知一个数的补码,求原码 的操作分两种情况: 

  • (1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 
  • (2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。 

        例如、已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为   “1”;其余7位1111001取反后为0000110;再加1,所以是10000111。

原码、反码、补码complement_第5张图片

原码、反码、补码complement_第6张图片原码、反码、补码complement_第7张图片

原码、反码、补码complement_第8张图片

你可能感兴趣的:(Matlab数字信号处理,matlab,算法)