精华内容
下载资源
问答
  • 最近在做一个关于带符号二进制整数转十进制的一个小case,去网上搜了很多,发现现有的程序不是很复杂就是写的让人看得不是很明白,针对这个过程,自己写了两个比较简单易懂的函数去实现。 def add_1(binary_inpute):...

    利用python实现带符号(正负)二进制编码转十进制整数

    程序代码实现

    最近在做一个关于带符号二进制整数转十进制的一个小case,去网上搜了很多,发现现有的程序不是很复杂就是写的让人看得不是很明白,针对这个过程,自己写了两个比较简单易懂的函数去实现。

    def add_1(binary_inpute):#二进制编码加1
        _,out = bin(int(binary_inpute,2)+1).split("b")
        return out
    
    def reverse(binary_inpute):#取反操作
        binary_inpute = list(binary_inpute)
        binary_out = binary_inpute
        for epoch,i in enumerate(binary_out):
            if i == "0":
                binary_out[epoch] = "1"
            else:
                binary_out[epoch] = "0"
        return "".join(binary_out)
    
    a = "000000000011010"
    if a[0] == "1":#判断为负数
        a_reverse = reverse(a[1:])  # 取反
        a_add_1 = add_1(a_reverse)  # 二进制加1
        a_int = -int(a_add_1, 2)
    else:
        a_int = int(a[1:])
    print(a_int)
    

    ##思路图
    在这里插入图片描述

    展开全文
  • 二进制整数及其表达方式

    千次阅读 2019-09-29 21:42:33
    回去又复习了一遍计算机里面二进制整数的表示方式,主要分为3类:原码、反码和补码。 当然,我还是要在开头说明一下,计算机里都是以补码的形式储存数据。 原码 这种方式最好理解,将我十进制的“逢十进一”换成二...

    回去又复习了一遍计算机里面二进制整数的表示方式,主要分为3类:原码、反码和补码。
    当然,我还是要在开头说明一下,计算机里都是以补码的形式储存数据。

    原码

    这种方式最好理解,将我十进制的“逢十进一”换成二进制的“逢二进一”就行了。
    具体如何做呢?还是介绍一下十进制和二进制的转换方式吧。

    • 二进制转换十进制

    话不多说,直接写公式,“按权展开求和”:


    1112483-20190912171648158-1465407806.png
    • 十进制转二进制

    按照套路来,用"除2取余,逆序排列"的方法。
    举个栗子:789转换成二进制
    1.除二取余

    计算余数位数
    789/2=394余1第10位
    394/2=197余0第9位
    197/2=98余1第8位
    98/2=49余0第7位
    49/2=24余1第6位
    24/2=12余0第5位
    12/2=6余0第4位
    6/2=3余0第3位
    3/2=1余1第2位
    1/2得0余1第1位

    2.逆序排列余数得到结果
    789=1100010101(B)
    后面括号里的B代表该数为二进制

    • 计算机里为什么要用二进制码来表示数据

    1、技术实现简单。计算机是由逻辑电路组成,逻辑电路通常只有两种状态,开关的接通和断开,正好用“0”“1”表示。
    2、运算规则简单,两个二进制数的和、积运算组合简单。
    3、适合逻辑运算,二进制只有两个数码,和逻辑代数中的“真”“假”相吻合。
    4、易于进行转换,二进制和十进制数转换简单。
    -----------摘自百度知道

    对于原码,我觉得了解上面的就差不多了。

    反码

    顾名思义,反码其实就是把原码所有的位数反过来,1->0,0->1
    这有什么用?为什么要这么做呢?
    在此之前,我们先回答以下几个事实

    • 原码表示负数很困难
      你可以在电脑的很多地方看到负数运算吧?如果整数在计算机里都用原码来表示,负数怎么运算呢?这将是一个非常困难的话题。如果要达到这种效果,可能需要在硬件(运算器)的设计时,加入特定的记录和运算负数的功能,但设计到硬件这方面,问题会变得很麻烦,或者假如它被设计出来,最终应用到电脑上时性能也会大大减弱。引入反码,就是希望能够通过另一种编码形式,解决负数表示的问题。说到这你可能还是很疑问为什么这样反过来就可以表示负数了,不要急,我来逐步解决你的问题,先继续往下看。
    • 4个二进制位能表示的最大整数

    你可能会觉得1111(B)就是最大的,按照我们之前在原码里介绍的方法,把它转化为十进制:
    1111(B) = 15
    问题来了,如果我们要表示负数呢?所以我们需要抽出一位来表示正负,也就是第一位,并且规定0为正,1为负(其实这也不能说是规定,它很神奇,事实就是这样)
    既然有这个规定,我们能表示的最大整数就不能是255了,而是:
    0111(B) = 7
    那最小整数呢?是1111(B) = -7吗,错误!继续往下看,了解如何表示负数。
    你可能会比较陌生这样的表示方法,但现在只要你记住有这样的规定就行。

    • 如何用反码表示整数(包括正负数)
      规则:十进制 > 二进制原码 > 二进制反码
      将十进制的绝对值转换为二进制原码,如果该数为整数,则不变(反码=原码),若该数为负数,则按位取反,得到反码。
      以下列表列出了0附近的几个反码(假如我们使用4个二进制位,表示负数一定要确定有多少个二进制位):
    二进制反码十进制整数
    01015
    01004
    00113
    00102
    00011
    00000
    11110
    1110-1
    1101-2
    1100-3

    从上面到下面,其实大部分还是很好理解的,反码每次-0001得到下面的数(这和十进制是一样的),但是我们注意到,有两个0。我们要讨论一下为什么0000-1111得到的还是0,其实仔细想想会发现确实是这样的,因为0可以看作是+0和-0,按照上面的规则,就有两种表示方法了。
    那0000 - 0001 = 1111又是为什么呢?
    这是因为溢出了,你可以理解为0000的前面有无数个1,在后一位不够的时候会向前一位借1(但是这个1是不会还的)。现在讨论溢出还早,这个理解起来有点麻烦。
    你现在要知道,如何将十进制数转化为二进制反码表示,并且知道0可以有两种方法表示,就行了。

    • 一个字节表示的最小整数
      观察二进制反码的变化,你会发现反码表示正负数的形式,并不是我们想的那样:先用原码表示绝对值,然后前面加一个1或者0让他变成正或者负。所以这就是为什么之前你认为的“1111(B)是能够表示的最小整数”这句话是错的,因为它其实表示的是0。
      那如何得到最小整数呢?
      我们还是看上面列表里的规律吧,继续往下走,直到反码的后3位全部0,即1000(B)(第一位我们不能动,因为如果在此继续减下去,它将变成一个正数!在实际计算机里也是这样的),我们反向走一遍规则,将1000(B)转化为绝对值,就是1000(B) > 0111(B) > 7,因为它是负数,所以是-7,这就是4个二进制位能够表示的最小整数了。
    • 公式法得到反码
      想要用原码转换的方法得到一个数的反码吗?这样会让转换过程更加通用。看下面的公式:


      13298799-d3f25bd38b46cf21.png

      其中n为二进制位数,N为十进制数的绝对值
      假如我们将十进制-6用4个二进制位表示,那么n=4,N=6,公式得到N' = 9,然后用原码表示9就得到了二进制数:1001,它就是-6的反码了。


    原文地址:https://www.jianshu.com/p/8314710ba093?from=singlemessage

    转载于:https://www.cnblogs.com/jpfss/p/11512978.html

    展开全文
  • 任意输入一个十进制整数,包括正数负数,通过程序实现可以输出相应的二进制编码
  • 在使用Pyserial与STM32进行通讯时,遇到了需要将十六进制整数以Ascii码编码的字符串进行发送并且将接收到的Ascii码编码的字符串转换成十六进制整型的问题。查阅网上的资料后,均没有符合要求的,遂结合各家之长,用...
  • 在程序中表示集合的方法有很多种,当集合中的元素个数较小时候,可以用二进制来表示,每一个二进制转换成十进制的整数可以唯一的表示一个集合。这个技巧也在算法竞赛中经常用到。 博客链接:...

    在程序中表示集合的方法有很多种,当集合中的元素个数较小时候,可以用二进制来表示,每一个二进制转换成十进制的整数可以唯一的表示一个集合。这个技巧也在算法竞赛中经常用到。

    博客链接:https://www.cnblogs.com/hdwang/p/6234931.html

     

    比如有一个集合{0,1,2…n-1}

    那么我们可以进行如下操作:

    空集.............................0
    只含有第i个元素的集合{i}............1<<i
    含有全部n个元素的集合{0,1...n-1}....(1<<n)-1//含有n个元素的全集
    判断第i个元素是否属于集合S...........if(S>>i&1)
    向集合中加入第i个元素S∪{i}..........s|1<<i
    从集合中取出第i个元素...............s&~(1<<i)
    集合S和T的并集S∪T.................S|T
    集合S和T的交集S∩T.................S&T

    比如 只含有第i个元素的集合为什么可以表示成1<<i

    举个例子 比如只含有第2个元素的集合 那么 1<<2=2^2 二进制表示就是100   第0个元素没有 因为在第0位置为0 第1个元素没有因为在第1位置为0 第2个元素为1 表示有第二个元素 所以就这样表示(它是倒着来的)。

    比如  含有全部n个元素的集合{0,1...n-1}....(1<<n)-1//含有n个元素的全集

    举个例子 含有全部3个元素的集合 {0,1,2}   那么(1<<3)-1 = 7=111(二进制)    是不是对应二进制位置都为1

    比如 判断第i个元素是否属于集合S...........if(S>>i&1)

    举个例子 比如一个集合s{1 2 3}  判断它的第2个元素是否属于s 将它的二进制111 右移2位得到001 与1位与 得到1 说明第二个元素属于集合s。

     

     

     

    展开全文
  • 二进制整数的加,减运算

    千次阅读 2015-08-14 14:59:16
    二进制整数的加,减运算   前言 在平时的编程中,当进行整数运算时,经常会遇到一些奇怪的结果,比如两个正数相加出现了负数,两个负数相加出现了正数,这些都是因为数值表示的有限性导致的.来看一个案例:  int a = ...

    二进制整数的加,减运算

     

    前言

    在平时的编程中,当进行整数运算时,经常会遇到一些奇怪的结果,比如两个正数相加出现了负数,两个负数相加出现了正数,这些都是因为数值表示的有限性导致的.来看一个案例:

                int a = 0x7FFFFFFF;

                int b = 0x7FFFFFFF;

                

                Console.WriteLine(a);

                Console.WriteLine(b);

                Console.WriteLine(a+b);

    我这是C#的代码,我告诉你输出结果吧:-2

    程序中的ab都是很大的正整数,结果它们相加会得到一个负数.

     

    再看看用C语言写的代码:

    #include <stdio.h>

     

    int main(){

        int a = 0x7FFFFFFF;

        int b = 0x7FFFFFFF;

        printf("%d\n",a);

        printf("%d\n",b);

        printf("%d\n",a+b);

    }

    输出结果也是-2

    这是咋个回事呢?下面跟随你单哥咱们一起探个究竟!

     

     

     

    无符号加法

     

    记得小时候杂学的加法把?我们都是使用的图画表示,就是上面是加数下面是加数,左边一个加号,逢十进一,然后下面一条横线,横线下面是结果.想起来了吧

     

    对于二进制整数来说,其实是可以用这种最原始的方式去计算,由此也可以认识到,二进制整数的加法也是非常简单的.只不过与我们平时的十进制算法有一个最大的区别,那就是我们在计算机当中进行计算时,结果的位数都是有限制的.因此我们计算完成后,可能需要对结果进行截断操作.

     

    前面一节咱们刚说了有关阶段的内容,那么明显这里就这样用上了.这里使用的时候有一个前提,我们可以假设是进行w位的二进制运算,那么在运算之后的实际结果也一定是w位的.这里有两种情况,一种结果依然是w位的,也就是w+1位为0.第二种则是到达了w+1,这个时候我们需要将结果截断到w.(明白不?就是3+39+9的案例,一个是6,6是一位,一个是18,18是两位,还不明白,我建议你从事别的专业吧,计算机可能不太适合你...)

     

    第一种情况属于正常的加法运算,对于第二种来说,我们根据上一张的结论,假设完整的结果为sum,则实际的结果最终为sum mod 2w。

    在书中给出了一个公式,它得到了这个结果的一个前提是两个操作数都满足小于2w,它与我们上面取模的结果其实是一样的。


     

    再稍微解释一下,对于第一种情况,x+y < 2w,则sum mod 2w是与sum一致的。对于第二种来说,当 2w =< x+y < 2w+1,对 x + y 进行2w的取模运算,与 x + y - 2w是等价的。

     

     

     

     

    无符号的非

    无符号的加法会形成一个阿贝尔群,这意味着无符号的加法满足一些特性.比如说可交换,可结合等等.在这个群中,单位元为0,那么每一个群中的元素,就是每一个无符号数u,都会拥有一个逆元u-1,满足 u+ u-1 = 0。这个结论的来源是,对于w位上的无符号运算来讲,倘若两个无符号数的加法运算结果为2w,也就是1后面跟w0,此时截断之后的结果则为0

    从以上的简单分析,我们可以很容易的得到一个无符号数的逆元满足以下公式(公式中的左边就是我写的u-1,由于图中的符号在博文中不好编辑,所以我以u-1替代)。

     

     

     

     

     

     

    补码加法       

    对于不骂的加法来讲,我们会建立在无符号假发的基础上来进行,这么做的一个重要前提是,他们的位表示都是一样的.

     

    其实补码加法就是先按照无符号加法进行运算,而后再进行无符号和有符号的的转换.因此我们根据上面的结论可得,对于两个补码编码的有符号数来说,他们进行加法运算的最终结果为,假设实际的无符号结果为sum,那么最终的实际结果为:

    U2Tw(sum mod 2w)。

    上面这个结论看起来很简单,但是实际上它的运算结果还是比较复杂的,树中给出了四种情况的分析,采用数学推导和证明的方式来说明.

     

    与无符号加法不同的是,这里会出现三种结果,一种是正常的结果,一种是正溢出,一种数负溢出.

     

    对于正溢出的时候,我们的结果与无符号数类似,取模之后等价于减去2w次方.而当负溢出的时候,则刚好相反,取模之后的结果等价于加上2w次方.更直观的,由于我们最终科表示的补码范围在-2w-1(包含)到2w-1之间,所以我们总是要试图将最终的实际结果报纸在这个范围之内.于是我们可以直观的得到下面的结果

     

     

     

    补码的非

     

    对于补码来说,它同样的与无符号有一样的特性,也就是对于任意的一个w位的补码t来说,他都有唯一的逆元t-1次方,是的t+t-1次方=0.

    一个w位的补码数范围在-2w-1次方(包含)2w-1次方之间,直观的可以看出,对于不等于-2w-1次方的补码数x来说,他的逆元就是-x.而对于-2w-1次方来说,他的二进制位表示为1后面跟着w-10,我们需要找到一个数与其相加之和结果为0.

    这种时候我们需要考虑的是,如果是-x,也就是2w-1次方,则它的位表示需要w+1,是不存在.因此我们需要考虑溢出的情况,对照上面的公式2.14,负溢出的时候需要加上2w次方,因此-2w-1次方的逆元就是-2w次方+2w-1次方=-2w-1次方,也就是他本身.

    综上,最终我们可以得到补码的逆元满足以下公式(这里与上面一样,公式左边是我们所说的逆元t-1次方).

     

     

     

     

    二进制整数的减法

    减法运算器是是可以由加法运算替代的,我们上面已经介绍过了无符号和补码的非,其实很多CPU是没有减法运算器的,他们都是将减数进行逆运算以后送入加法器,然后进行加法运行,这样得出来的结果就是减法运算最终的结果.

     

     

    比如我们考虑一种简单的情况,w=4时的无符号减法运算,对于5-4这个减法运算来说,我们可以由5+4-1次方(其中4-1次方是4的逆元的意思,不是四分之一的意思)来替代这个减法运算.

     

    为了更加直观,咱们一起来算一下,首先4的逆元根据上面的公式可以得到4-1次方=24次方-4=12.呢么我们现在需要对512进行加法运算,他们的位分别表示为01011100,结果为10001,就是十进制17的位表示.不过由于我们的w=4,因此截断之后结果为0001,就是十进制的1.最终结果得到5-4=1.

     

    对于5-4来说,是考虑的结果为正的情况.或许有人认为会对结果为负或者说无符号数移除的情况下有疑问,因此咱在这里对这种情况也做了一个简单的介绍.我们考虑一个简单的计算0-1,我们可以得到1-1次方=24次方-1=15.此时对015进行加法计算,他们的位表示分别为00001111,结果为1111.

    看到这里估计有人会有疑问了,这是怎么回事,0-1=15?

    当然不是,,,这个结果其实是正确的.考虑使用补码编码来解析1111这个位表示,它代表的值就是-1.151111这个位表示在无符号编码情况下的解析结果.

     

    因此这里有一个公式,就是对于两个整数xy来说,x-y=x+y-1次方,这个公式代表的意义是位表示,而不是实际的数值.

     

     

     

    小结

    主要讲解了二进制整数的加法运算,还有减法的简单介绍.

     

     

     

     

     

     


     

    展开全文
  • 从高级语言程员的角度来看,有数组、指针、结构、实数、整数、字符和字符串等类型数据。从算法描述的角度来看,有图、表、树、队列、矩阵等结构类型的数据。在计算机内部数据出现的任何形态最终都由机器指令来处理。...
  • C语言的有符号与无符号,二进制整数的扩展与截断     前一节说了整数的表示方式,,也就是无符号编码与补码编码.这一届说一下二进制整数的扩展与截断,这部分内容与C语言挂钩.so,我们先看以下C语言的有符号和无符号...
  • matlab中只能够实现十进制整数转换为二进制,对于小数部分会直接忽略,这对于精确度很高的数据来说,非常不合理。下面是自己编写的实现十进制小数的二进制编码的matlab代码。 基本原理: 整数部分:除二取整,逆序...
  • [技巧]集合的二进制整数表示

    千次阅读 2015-08-03 14:35:36
    先看一个题:poj3279 fliptilehttp://blog.csdn.net/tlonline/article/...在程序中表示集合的方法有很多种,当元素比较少时,像这样,用二进制码来表示比较方便。集合{0,1,2…n-1}的子集可以用以下方式编码整数
  • 算是读书笔记吧二进制编码二进制和我们平时用的十进制,其实并没有什么本质区别,只是平时我们是“逢十进一”,这里变成了“逢二进一”而已。每一位,相比于十进制下的 0~9 这十个数字,我们只能用 0 和 1 这两个...
  • 1二进制数1101.1111转换成十六进数应为()A.A.FB.E.FC.D.FD.A.E2二进制数110101对应的十进制数是()A.44B.65C.53D.743二进制数11011+1101等于()A.100101B.10101C.101000D.100114二进制数11101011-10000100等于()A....
  • 2.5我们着重介绍了二进制整数的加、减运算,本次我们继续介绍乘、除运算。本章是迄今为止最难的一章,希望各位猿友有所收获,也别忘了“点个推荐哦”。   引言    运算一直是程序运行当中一个重要的环节,而...
  • 计算机二进制编码

    2020-10-17 17:00:56
    二进制编码知识。
  • 从高级语言程员的角度来看,有数组、指针、结构、实数、整数、字符和字符串等类型数据。从算法描述的角度来看,有图、表、树、队列、矩阵等结构类型的数据。在计算机内部数据出现的任何形态最终都由机器指令来处理。...
  • 二进制编码(原码、反码、补码) 1.二进制怎么编码? 1字节 = 8位,所以它能表示的最大数当然是8位都是1(既然2进制的数只能是0或1,如果是我们常见的10进制,那就8位都为9)1字节的二进制数中,最大的数:...
  • 【基础】二进制编码

    千次阅读 2017-01-07 22:25:57
    意义xxxx几种编码及转换几种编码都需要懂,而且分情况。使用这些编码的基本前提,是确定单位,比如这里探讨的是一个字节,还是int(例如java中的...我们知道,1个字节的原码是支持正负127范围内的整数的,包括从-127到-
  • 所以,我们见到的计算机的一切都是通过二进制才能呈现出来的。这次就会着重介绍一下进制的计算和编码。 博文目录 数的进制 进制的转换 逻辑运算 常用编码 数的表示 符号数的机器码表示 before we star.....
  • 初谈二进制编码

    千次阅读 2014-09-24 02:45:50
    二进制:相对于十进制来说是逢二进一(位)。
  • 二进制编码

    千次阅读 2020-03-08 00:49:16
    计算整个二进制值的时候,在左侧最高位前面加个负号 0011这个二进制数,对应的十进制表示 −1×23+0×22+1×21+1×20 -1×2^3+0×2^2+1×2^1+1×2^0 −1×23+0×22+1×21+1×20 这种方法可以表示从-8到7这16个整数,...
  • 计算机数据的二进制编码整数

    千次阅读 2010-05-04 00:59:00
    世界上有两种人,懂和不懂二进制的。最近发现自己之前算是不懂的。...1. 无符号整数对于无符号整数没有符号位,所以上述二进制向量x→所表示的无符号整数就是 例如W=4时,[1010]就是1*23 +0*22 +1*21+0*20=8+0+2+0
  • 二进制编码知识

    2016-05-17 20:18:12
    对于整型数据,二进制的表示为符号位+数值位,对于浮点型数据,十进制转二进制的方式如下将十进制浮点型数据转换为二进制时分别将整数部分和小数部分转化为二进制对于整数部分,每次除2取余直到商为0,第一个除法...
  • 2.5我们着重介绍了二进制整数的加、减运算,本次我们继续介绍乘、除运算。本章是迄今为止最难的一章,希望各位猿友有所收获,也别忘了“点个推荐哦”。   引言    运算一直是程序运行当中一个重要的环节,而...
  • 遗传算法之二进制编码

    万次阅读 热门讨论 2017-09-05 19:33:43
    遗传算法的基本步骤遗传算法 GA 的流程如图所示:Created with Raphaël 2.1.0编码把所需要选择的特征进行编号,每一个特征就是一个基因,一个解就是一串基因的组合。为了减少组合数量,在图像中进行分块,然后把每...
  • 话题:计算机中采用二进制编码的原因是什么回答:计算机采用二进制的原因 (1)技术实现简单,计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。 (2)简化运算...
  • 二进制和量化编码

    2021-04-18 00:11:20
    小数 10 进制转二进制: 如 0.8, 转为 2 进制要: 0.8×2=1.6→10.6×2=1.2→10.2×2=0.4→00.4×2=0.8→00.8×2=1.6→1⋮×2=⋮→⋮ \begin{aligned} 0.8 \times 2=1.6\to1 \\ 0.6\times2=1.2\to1\\ 0.2\times2=0.4...
  • 进制整数的反码

    2019-03-23 18:57:21
    给定十进制数 N,返回其二进制表示的反码所对应的十进制整数。 示例 1: 输入:5 输出:2 解释:5 的二进制表示为 “101”,其二进制反码为 “010”,也就是十进制中的 2 。 示例 2: 输入:7 输出:0 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 126,003
精华内容 50,401
关键字:

二进制整数编码