精华内容
下载资源
问答
  • 二进制补码求原码
    2022-04-13 16:37:21
    def ori2com(ori_str):
        """
        将原码字符串 -> 补码字符串
        :param ori_str:原码字符串
        :return:补码字符串
        """
        # 如果符号位为正,则原码与补码相同
        if ori_str[0] == '0':
            return ori_str
        elif ori_str[0] == '1':
            value_str = ""
    
            # 数值位按位取反
            for i in range(len(ori_str)):
                if i == '1':
                    continue
                if ori_str[i] == '0':
                    value_str += '1'
                elif ori_str[i] == '1':
                    value_str += '0'
    
            # 数值位加 1
            n = int(value_str, 2) + 1
            com_str = bin(n)[2:]
            if len(com_str) >= len(ori_str):
                # 说明进位到符号位了
                com_str = '0' + com_str[1:]
            else:
                # 0不够,中间填充0
                n = len(ori_str) - len(com_str) - 1
                for i in range(n):
                    com_str = '0' + com_str
                com_str = '1' + com_str
            return com_str

     

    更多相关内容
  • 原码 补码 反码

    1、二进制补码的计算方法

    二进制的补码计算非常简单,各种教材中也经常使用二进制来说明源码、反码与补码三者的关系,掌握一定基础的人都知道一下规则:

    1.1 原码

    最高位为符号位,0表示正数,1表示负数。

    例如:
    X = 0b11 (3),四比特表示原码 = 0011(3) ;
    
    X = - 0b11(-3) ,四比特表示原码 = 1011(11) ;

    1.2 反码

    最高位为符号位,0表示正数,1表示负数。

    正数的反码等于本身,负数的反码除符号位外,各位取反:

    例如:
    X = 0b11 (3),四比特表示原码 = 0011(3),对应反码为 = 0011(3) ;
    
    X = - 0b11(-3) ,四比特表示原码 = 1011(11),对应反码为 = 1100(12)  ;

    1.3 补码

    最高位为符号位,0表示正数,1表示负数。

    正数的补码等于本身,负数的补码等于反码+1:

    例如:
    X = 0b11 (3),四比特表示原码 = 0011(3),对应反码为 = 0011(3) ,补码为 = 0011(3);
    
    X = - 0b11(-3) ,四比特表示原码 = 1011(11),对应反码为 = 1100(12),补码为1101(13)  ;

    2、十进制的补码计算方法

    对于十进制数来说,通过前面的性质不难得到正十进制数补码等于其本身,对于负十进制数来说如果还按位进行运算就太麻烦了!为了讲明白,我们从补码的起因说起:

    “反码加一”只是补码所具有的一个性质,不能被定义成补码。负数的补码,是能够和其相反数相加通过溢出从而使计算机内计算结果变为0的二进制码。这是补码设计的初衷,具体目标就是让1+(-1)=0,这利用原码是无法得到的:

    例如前面举得例子:

    例如:
    X = - 0b11(-3) ,四比特表示原码 = 1011(11),对应反码为 = 1100(12),补码为1101(13)  ;

     

    如果使用python的话,可以使用&来快速获取补码:

    -3&0xf
    Out[1]: 13
        
    5&0xf
    Out[2]: 5

    这里的0xf指的是0b1111,表示4位的寄存器。如果是7位寄存器,0b111111就是0x3f。

    3、已知补码怎么求原码?

    对于正数来说,根据前面的介绍很容易知道 原码=补码=反码,接下来主要讨论给定负数的补码怎么求负数的原码:

    3.1 二进制

    先说结论:补码的补码就是原码。下面开始证明:

    上面两式子说明了:

     

    也就是说补码的补码就是原码,有点负负得正的意思哦。

    3.2 十进制

     

    展开全文
  • 比如下面的几个数字: 十进制数 2 3 -2 -5 二进制原码 0010 0011 1010 1101 二进制反码 0010 0011 1101 1010 二进制补码 0010 0011 1110 1011 我们用4 位二进制补码来计算 3+(-2),如下: 最高位的1 发生上溢出,...

    公号:码农充电站pro
    主页:https://codeshellme.github.io

    计算机最基本的工作是处理数据,而数据的最底层表现形式是二进制,并非是我们人类熟悉的十进制。可以这么认为,计算机其实是很“笨的”,它只理解二进制数据。

    今天,主要介绍计算机是怎样做加减运算的。你可能会想,加减运算?这么简单的事情,还用介绍?也许还真不是你想的那样。

    计算机的运算是由CPU 完成的,而CPU 只会做加法运算,不会做减法运算,那计算机怎样完成减法工作呢?

    1,二进制数

    我们先来看看二进制数。

    二进制数是由0,1 组成的,比如:

    • 十进制的5,用二进制表示是 101。
    • 十进制的7,用二进制表示是 111。

    数字由正数和负数组成。为了表示正负数,计算机中就有了有符号数无符号数之分:

    • 无符号数:英文为 unsigned,只能表示正数。
    • 有符号数:英文为signed,即能表示正数,又能表示负数。

    C/C++ 语言中的数字有有符号数无符号数之分。
    Java 语言所有的数字都是有符号数

    假如,我们用 4 位二进制,来表示无符号数,也就是只表示正数,能表示的范围是 0 到 15,转换关系如下表:

    十进制数二进制数十进制数二进制数
    0000081000
    1000191001
    20010101010
    30011111011
    40100121100
    50101131101
    60110141110
    70111151111

    有符号数,即要表示正数,也要表示负数。

    要用二进制表示有符号数,需要用二进制的最高位来表示符号,0 表示1 表示。所谓的最高位,也就是最左边那一位。

    用 4 位二进制,来表示有符号数,能表示的范围是 -8 到 7,转换关系如下表:

    十进制数二进制数十进制数二进制数
    00000-81000
    10001-11001
    20010-21010
    30011-31011
    40100-41100
    50101-51101
    60110-61110
    70111-71111

    上表中的最高位的符号位,已标红。

    要注意,对于有符号的4 位二进制 ----1000 不是 -0,而是 -8

    可以总结出,对于N 位的二进制数:

    • 无论是表示有符号数还是无符号数,都能表示2^N 个数字。
    • 若用于表示无符号数,则能表示的范围是 [0, 2^N - 1]
    • 若用于表示有符号数,则能表示的范围是 [-2^(N-1), 2^(N-1) - 1]
      • 需要注意,在有符号数中,对于符号位是 1,后面 N-1 位全是 0,这种情况表示的是 -2^(N-1)(也就是所能表示的最小值),而不是 -0
      • 实际上是将-0 这种情况解释成了最小值,否则就会出现 +0-0 两个0

    2,二进制原码

    上面介绍到的二进制就是原码形式。

    原码就是除符号位外的其他位,保存该二进制数的绝对值。

    用原码进行加法计算

    计算机中的数字运算都会先转成二进制数再进行计算。

    我们用原码来计算加法,用4 位二进制数来计算 3 + 2,过程如下:

    在这里插入图片描述
    可以看到,用原码计算加法是没有问题的。

    用原码进行减法计算

    我们再用原码来计算减法,因为CPU 只会计算加法,所以计算减法时,会将减法转换成加法。

    比如,用4 位二进制数来计算计算 3 - 2,会将其转换成 3 + (-2), 过程如下:

    在这里插入图片描述
    可以看到 3-2 计算出来的结果是 -5,显然是错误的。

    所以,用二进制原码来计算减法是行不通的。实际上,计算机计算减法用的是补码

    在介绍补码之前,我们先来看下什么是溢出

    3,数字溢出

    计算机中数字的表示是需要内存空间的,不同类型的数字所能占用的空间是不一样的。

    比如,在Java 语言中short 类型占用 2 个字节,int 类型占用 4 个字节。

    一个字节等于 8 位。

    既然空间大小是有限制的,所以计算机中的数字也是有范围的,即上限下限,如果数字超出限制,就会产生溢出。超出上限叫上溢出,超出下限叫下溢出而溢出的部分会直接被舍去

    就像我们在上文中介绍的,对于N 位二进制有符号整数,所能表示的范围是 [-2^(N-1), 2^(N-1) - 1]

    由于溢出的部分会被舍去,那么最大值加1,将发生上溢出,变为最小值;最小值减1,将发生下溢出,变为最大值。

    在这里插入图片描述

    我们用Java 中的int 类型来验证,Javaint 类型的最大、最小值分别是:

    • 最大值:Integer.MAX_VALUE,是 2147483647
    • 最小值:Integer.MIN_VALUE,是 -2147483648

    用下面代码验证:

    System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE); // true
    System.out.println(Integer.MIN_VALUE - 1 == Integer.MAX_VALUE); // true
    

    这两行代码的输出均为true,说明最大值加1 变为最小值,最小值减1 变为最大值。

    所以,在计算机中,只要一个整数的类型确定了,那么它所能占用的内存空间大小也就确定了,从而它所能表示的数字范围也就确定了。那么不管给这个整数加多大的数字,或者减多大的数字,最终的结果都只能在这个范围内旋转。

    就像表盘一样,当表针走过最大值的时候,就变成了最小值。

    在这里插入图片描述

    同样,这也等同于数学中的取余运算。只要分母确定了,不管分子是多大,或者多小的数字,最终的结果也都是在一个确定的范围之内。

    比如我们对十进制5 进行取余计算,那么最终的结果都是在[0, 4] 范围之内,如下:

    • 0 % 5 = 0
    • 2 % 5 = 2
    • 397 % 5 = 2
    • 99999 % 5 = 4

    可以总结出,对数字N 进行取余,N >= 2 且为整数,那么结果都在 [0, N-1] 范围之内。

    4,二进制反码与补码

    知道了溢出,就可以介绍CPU 如何计算减法了。CPU 的减法运算使用了二进制补码,补码实际上就是采用了溢出的原理。

    我们直接给出反码与补码的定义:

    • 反码定义:正数的反码等于其原码,负数的反码是其原码除符号位外,按位取反。
    • 补码定义:正数的补码等于其原码,负数的补码是其反码加1。

    比如下面的几个数字:

    十进制数23-2-5
    二进制原码0010001110101101
    二进制反码0010001111011010
    二进制补码0010001111101011

    我们用4 位二进制补码来计算 3+(-2),如下:

    在这里插入图片描述

    最高位的1 发生上溢出,直接被舍去,所以结果是正确的。

    所以,要记住,真实的计算机中的二进制是用补码表示的,而不是原码

    5,总结

    本篇文章主要介绍了:

    • CPU 只能做加法,不能做减法,减法要转成加法做计算。
    • 二进制数字有三种表示方式:
      • 原码:除符号位外的其他位,保存该二进制数的绝对值。
      • 反码:正数的反码等于其原码,负数的反码是其原码除符号位外,按位取反。
      • 补码:正数的补码等于其原码,负数的补码是其反码加1。
    • 计算机中的数字采用二进制补码表示,而不是原码表示。
      • 补码采用了溢出的原理。
    • 计算机中的数字是有范围限制的,超出限制会发生溢出。
      • 超出上限叫做上溢出。最大值加1会发生上溢出,变为最小值。
      • 超出下限叫做下溢出。最小值减1会发生下溢出,变为最大值。

    (本节完。)


    推荐阅读:

    决策树算法-理论篇

    决策树算法-实战篇

    朴素贝叶斯分类-理论篇

    设计模式之高质量代码

    如何高效使用VIM


    欢迎关注作者公众号,获取更多技术干货。

    码农充电站pro

    展开全文
  • 二进制补码为什么是原码取反加一

    千次阅读 2020-03-23 20:37:09
    二进制补码为什么是原码取反加一、补码,反码。

    一.二进制和原码的定义

    二进制

    在二进制数中,每一位仅有01两个可能的数码。所以计数基数为2。低位和相邻高位间的进位关系是“逢二进一”。

    原码

    为了表示数的在二进制数的前面增加一位符号位。符号位为0表示这个数为正数,符号位为1表示这个数为负数。这种形式的数称为原码。

    二.反码和补码的形式

    反码

    正数反码是其本身,负数反码是将其原码除符号位,其余各位取反(0变1,1变0)。

    补码

    正数补码是其本身,负数补码是在其反码最后一位加1

    三.补码为什么是原码取反加一

    补码的出现

    当我们使用二进制原码进行相反数的加法运算如:1+(-1)时
    alt
    得到的结果为-2。显然这个结果是错误的。为了解决这个问题出现了补码。

    补码的原理

    我们知道当一个二进制数的位宽确定后那么它所能表示的数也就具有了范围。基于这个原理为了实现相反数相加结果为0,我们可以使相反数相加的结果溢出从而成为0。
    在这里插入图片描述
    在这里插入图片描述
    如上图,假设还是1+(-1)= 0,二进制数位宽为4位。通过计算可以得出-1应表示为1111。我们将1111称为4位二进制数-1的补码。
    其中10000等于24。通过分析可以得出负数n的补码为2n-|n|。

    反码的确定

    一个数与其取反相加即可得到该数对应位宽的最大二进制数。
    在这里插入图片描述
    观察发现一个负数的反码就等于它的原码除符号位,其余各位取反+1。
    同时为了在补码的计算过程中不出现加法计算所以将一个负数的原码除符号位,其余各位取反得到的数称为它的反码。

    四.总结

    当我们初次读到“二进制补码等于原码取反加一。”这句话时我们会下意识的产生一种反码产生于补码前的错觉。但是事实上在数制的发展思路中补码应该先于反码出现,甚至于我们可以理解为,为了补码在计算机中的计算方便所以产生了反码。

    强调:

    1.理解思路应该是补码先于反码。
    2.反码加一产生补码只是一种数字组合中的巧合,其本身并不重要,关键要理解补码的原理。
    3.反码变补码的+1是指在最后一位加一,不是加到个位。

    展开全文
  • 今天一场技术笔试一道编程题难住了我,算出一个十进制数的二进制补码和对应的16进制,由于时间紧张,加上紧张,做的极差,因此mark以下
  • 本VI,是在labview环境开发。16进制到二进制原码、反码、补码计算
  • 已知负数的补码求原码

    千次阅读 2021-05-14 00:19:38
    这里有个简单的求补码的方法,从原码的最低位向最高位看去,遇到第一个1前,保持不变,第一个1前面的二进制串取反(符号位保持不变)。 下面是一个例子。 x=1011 0110 这是一个负数,它的原码,反码,补码分别是:...
  • 二进制、八进制、十进制、十六进制的转换
  • 什么是二进制二进制是计算技术中广泛使用的一中数制,是由0和1两个数码来表述的数,他的基数是2,进位规则是“逢二进一”。 一、二进制转换为十进制? 按权展开求和,该方法的具体步骤是先将二进制的数写成加权...
  • 补码 = 原码取反再加1 算法1 10010110是补码,应先减去1变为反码,得10010101; 由反码取得源码dao即除符号位外其他为按位取反,得11101010,即十进制数的-106 算法2 负数补码速算法,由最低位(右)向高位(左)查找到...
  • 正数的补码等于原码 负数的补码等于符号位不变,剩下的取反加一(算补码的时候符号位不参与计算) 0000 0101 + (加法需要符号位参与) 1111 1110 结果为 0000 0011 -> 3 因为结果为正数,所以不用再符号位不变取反...
  • 二进制4位数原码补码、反码表

    千次阅读 2022-03-30 20:07:33
    提示:计算机基础 文章目录4位源码、反码、补码表 ...二进制补码 1 0001 0001 0001 2 0010 0010 0010 3 0011 0011 0011 4 0100 0100 0100 5 0101 0101 0101 6 0110 0110 0110 7.
  • 1. 二进制最高位是符号位:0正1负 2. 对于正数,负数和零 正数:三码一样 负数: 反码 = 原码符号位不变,其他位取反 补码 = 反码+1 反码 = 补码-1 零:三码都是零 3. 计算机在内部计算的时候用的是补码(因为补码...
  • 二进制运算(原码、反码、补码

    千次阅读 2020-08-01 13:04:47
    二进制运算(正码、反码、补码) 机器数(机器存储的数) ​ 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1 //比如byte类型...
  • 二进制补码运算

    千次阅读 多人点赞 2020-07-23 13:52:43
    二进制负数的在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最...
  • 二进制原码、反码、补码
  • 二进制原码、反码、补码

    千次阅读 2021-11-30 08:25:50
    文章目录1、有符号数和无符号数2、二进制的原码、反码、补码原码反码补码小结举个栗子:3、思考:java中为什么byte的取值范围是-128~1274、Java中的<< 和 >> 和 >>> 1、有符号数和无符号数 其实...
  • 详细释义所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。补码表示法...
  • 二进制补码和十进制数的转换

    万次阅读 2020-04-03 23:24:58
    先考虑如何将二进制补码转换为十进制整数: 若符号位是0, 则该数是正数, 原码等同于补码. 可以由原码(也就是补码)得知代表的正整数. 若符号为是1, 则该数一定是负数, 可按照以下方式转换: 方式一: 先把符号位去掉, ...
  • 原码的加减法 加法一共有四种可能: 正数 + 正数:取绝对值相加即可,结果是正数 负数 + 负数:取绝对值相加,结果是负数 正数 + 负数:绝对值大的数减去绝对值小的数,符号谁大取谁的符号 负数 + 正数:绝对值大的...
  • 二进制原码补码

    千次阅读 2018-11-26 11:03:29
    原码为正数的时候,正数的原码反码补码都相同,即...现代计算机多数以二进制补码的形式来存放整数。简单的说,一个二进制数的每一位对应了一个权值,从最低为到最高位,权值依次是1、2、4、8、16……以此类推。其...
  • 二进制原码、反码和补码

    千次阅读 2020-09-27 11:15:10
    [转载:二进制位运算规则] ... 20的二进制补码:0001 0100  向左移动两位后:0101 0000  结果:r = 80 负数:r = -20 << 2  -20 的二进制原码 :1001 0100  -20 的二进制反码:1110 1011  ...
  • 二进制补码计算原理

    千次阅读 2021-03-11 08:29:04
    二进制的负数在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最...
  • 关于二进制补码及补码加法的思考

    千次阅读 2021-09-06 19:56:13
    笔者刚学数字电路,就在二进制补码处踩了许多坑,下面就来写一下我对二进制补码的感悟。 提示:以下是本篇文章正文内容,下面案例可供参考 一、生活中了解补码 首先展示一下补码的公式N(补)=R^n-N 这里的N是原码...
  • 二进制是逢二进一,八进制是逢八进一; 常见进制:二进制,八进制,十进制,十六进制; 学习进制的原因:计算机数据在底层运算时,都是以二进制形式。也有数据是八进制,十进制,十六进制进行存储或运算,了解不同...
  • 二进制、八进制、十六进制转换及原码、反码、补码转换 二进制 如果说十进制是人类的计算度量单位,那么二进制就是机器识别的计算度量单位 ,十进制逢十进一,例如9+1=10,到10进位,各位数为0,十位数则加1为1,写出来则...
  • 常用编码有原码、反码和补码原码 将符号位数字化0或1,数的绝对值与符号一起编码,即“符号-绝对值表示”。 X = +0101011 ------------------&amp;gt; [X]原 = 00101011 X = -0101011 -------------------&...
  • java二进制原码 补码与反码 计算机在任何情况下智只能识别二进制 计算机在底层存储数据的时候,一律存储的是 “ 二进制补码形式 ” 计算机采用补码形式存储数据的原因是:补码形式效率最高 什么是补码? ​ 二进制...
  • 二进制补码到十进制补码及其内的运算——关于补码的一点学习
  • 二进制原码补码的转换

    千次阅读 2020-08-24 10:18:32
    1.概念理解(注意正数的反码和补码就是原码,负数的补码是反码加1) 正数:原码=反码=补码 正数举例(数字3):11(原码)=11(反码)=11(补码) 负数:原码取反=反码;反码+1=补码 负数举例(数字-3):111(原码)-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,077
精华内容 14,430
关键字:

二进制补码求原码