精华内容
下载资源
问答
  • 最近在做一个关于带符号二进制整数转十进制的一个小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)
    

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

    展开全文
  • 任意输入一个十进制整数,包括正数负数,通过程序实现可以输出相应的二进制编码
  • matlab中只能够实现十进制整数转换为二进制,对于小数部分会直接忽略,这对于精确度很高的数据来说,非常不合理。下面是自己编写的实现十进制小数的二进制编码的matlab代码。 基本原理: 整数部分:除二取整,逆序...

    matlab中只能够实现十进制整数转换为二进制,对于小数部分会直接忽略,这对于精确度很高的数据来说,非常不合理。
    下面是自己编写的实现十进制小数的二进制编码的matlab代码。

    基本原理:

    • 整数部分:除二取整,逆序排列
    • 小数部分:乘二取整,顺序排列

    代码:

    含小数的十进制数转二进制:dec2inderectBin()

    % d 十进制数(或数组)
    % down 十进制数取值范围的下界
    % up 十进制数取值范围的上界
    % esp 精度
    
    function [dec2inbin,intL,decL] = dec2inderectBin(d,down,up,esp)
    % dec2inbin 二进制数组。行数为输入的十进制数的个数,列数为m
    % intL 整数部分长度,个数为输入的十进制数的个数
    % decL 小数部分长度,个数为输入的十进制数的个数
    
    % 老师讲的公式,十进制数用几位二进制表示
    m = ceil(log2((up-down)/esp));
    
    dec2inbin=[];
    intL=[];
    decL=[];
    for i=1:size(d,2)
     dec=d(i);
        % 整数部分
        integer=floor(dec);
        integer2bin=dec2bin(dec);
        intL=[intL size(integer2bin,2)];
        % 小数部分
        decimal=dec-integer;
        decimal2bin=[];
            for j = 1 : m-size(integer2bin,2)
            decimal2bin = [decimal2bin num2str(floor(decimal*2))];
            decimal=decimal*2-floor(decimal*2);
        end
        decL=[decL size(decimal2bin,2)];
        % 整数和小数拼接
        dec2inbinS=[integer2bin decimal2bin];
        dec2inbin=[dec2inbin;dec2inbinS];
    end
    end

    二进制表示的小数转十进制数:inderectbin2dec()

    % b 二进制编码数组。行数为需要解码的二进制数个数,列数为二进制编码位数
    % down 十进制数取值范围的下界
    % up 十进制数取值范围的上界
    % intL 整数部分长度,个数为输入的十进制数的个数
    % decL 小数部分长度,个数为输入的十进制数的个数
    
    function dec=inderectbin2dec(b,down,up,intL,decL)
    % dec 十进制数
    
    dec=[];
    for i=1:size(b,1)
        bin=b(i,:);
        % 整数部分
        integer=bin2dec(bin(1:intL(i)));
        % 小数部分
        decimal=0;
        for j = intL(i)+1 : intL(i)+decL(i)
            decimal=decimal+str2num(bin(j))*2^(intL(i)-j);
        end
        dec=[dec;integer+decimal];
    end
    end
    展开全文
  • C语言的有符号与无符号,二进制整数的扩展与截断 前一节说了整数的表示方式,,也就是无符号编码与补码编码.这一届说一下二进制整数的扩展与截断,这部分内容与C语言挂钩.so,我们先看下面C语言的有符号和无符号数. ...

    C语言的有符号与无符号,二进制整数的扩展与截断

     

     

    前一节说了整数的表示方式,,也就是无符号编码与补码编码.这一届说一下二进制整数的扩展与截断,这部分内容与C语言挂钩.so,我们先看下面C语言的有符号和无符号数.

     

     

    C语言中的有符号数和无符号数

    有符号数和无符号数的本质差别事实上就是採用的编码不同,前者採用补码编码,后者採用无符号编码.

     

    C语言中,有符号数和无符号数是能够隐式转换的,不须要手动实施强制类型转换.只是也正是由于如此,可能你一不小心就将一个无符号数赋给了有符号数.就会造成出乎意料的结果,就像以下这样:

    #include <stdio.h>

     

    int main(){

        short i = -12345;

        unsigned short u = i;

        printf("%d %d\n",i,u);

    }

     

    你自己观察一下输出结果你就会发现,一个负数变成了正数,再看以下这个程序,他展示了在进行关系运算时,因为有符号数和无符号数的隐式转换所导致的违背常规的结果.

    #include <stdio.h>

     

    void main(){

        printf("%d\n",-1 < 0U);

        printf("%d\n",-12345 < 12345U);

    }

    你自己看看输出结果,两个结果都是0,也就是false,这与我们直观的理解是违背的,原因就是由于在比較的过程中,有符号数被隐式的转换成了无符号数进行比較.

     

     

     

    扩展

    当我们将一个短整型的变量转换为整型变量时,就涉及到了位的扩展,此时由两个字节扩充为四个字节.

     

    在进行位的扩展时,最easy想到的就是在高位所有补0,也就是将原来的二进制序列前面增加若干个0,也称为零扩展.另一种方式比較特别,是符号扩展,也就是针对有符号数的方式,他是直接扩展符号位,也就是将二进制序列的前面增加若干个最高位.

     

    对于零扩展来说,非常明显扩展之后的值与原来的值是相等的,而对于符号扩展来说,则是一样,仅仅只是没有零扩展来的直观.我们在计算补码时有一个比較简单的办法,就是符号位若为0,则与无符号是类似的.若符号位为1,也就是负数时,能够将其余位取反终于再加1就可以.因此当我们对一个有符号的负数进行符号扩展时,前面增加若干个1,在取反之后都为0,因此依然会保持原有的数值.

     

    总之,在对位进行扩展式,是不会改变原有数值的.

     

    在书中对于负数的符号扩展还给出了这一过程的证明,事实上这个证明非常easy,就是利用了补码编码的公式而已.须要多提一点的是,这是使用了归纳法证明,因此这里仅仅是扩展了以为,详细步骤例如以下:

     

     

     

     

     

     

    截断

    截断与扩展相反,它是将一个多维二进制序列截断为较少的位数,就是与扩展是相反的过程.

     

    依据我们的直观推断也不难发现,截断可能会导致数据的丢失.对于无符号编码来说,截断后就是剩余位数的无符号编码数值.在书中给出了这一简单过程证明,它主要是想表明截断前后的数值的关系是取模所得到的.

     

     

     

     

    对与补码编码来说,截断后的二进制序列与无符号编码是一样的,因此我们仅仅须要多加一步,将无符号编码转换为补码编码就好了.因此对于无符号编码和补码来说,能够得到下面两个公式.

     

     

     

     

     

    其它语言中的有符号和无符号

    从上面的分析能够看出,具有有符号和无符号的语言,可能引起一些不必要的麻烦,并且无符号数除了能表示的最大值更大以外,似乎没什么优点了.因此有非常多语言是不支持无符号数的.

    我接触过的C#JAVA就仅仅有有符号数,这样省去了非常多不必要的麻烦.无符号数非常多时候仅仅是为了表示一些无数值意义的标识,比方我们的内存地址,此时的无符号数有点类似数据库主键或者说键值对中的键值的概念,仅仅是一个标识而已.

     

    小结

     

    低位转高位叫扩展,高位转低位叫做截断.

     

     

     

     

    转载于:https://www.cnblogs.com/claireyuancy/p/6963422.html

    展开全文
  • [技巧]集合的二进制整数表示

    千次阅读 2015-08-03 14:35:36
    先看一个题:poj3279 fliptilehttp://blog.csdn.net/tlonline/article/...在程序中表示集合的方法有很多种,当元素比较少时,像这样,用二进制码来表示比较方便。集合{0,1,2…n-1}的子集可以用以下方式编码整数

    先看一个题:poj3279 fliptile

    http://blog.csdn.net/tlonline/article/details/47066733

    在这题目中,需要枚举出第一行所有可能的表现形式。为了尝试第一行的所有可能性,使用了集合的整数表示方法。在程序中表示集合的方法有很多种,当元素比较少时,像这样,用二进制码来表示比较方便。集合{0,1,2…n-1}的子集可以用以下方式编码成整数。
    这里写图片描述
    这样表示以后,一些集合还可以对应写成如下方式:

    空集.............................0
    只含有第i个元素的集合{i}............1<<i
    含有全部n个元素的集合{0,1...n-1}....(1<<n)-1
    判断第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

    此外,想要将集合{0,1,….,n-1}的所有子集枚举出来的话,可以像下面这样书写:

    for(int S = 0; S < 1 << n; s++)
    {
        //对子集的处理
    }

    按照这个顺序进行循环的话,S就会从空集开始,然后按照{0},{1},{0,1},…,{0,1,…,n-1}的升序顺序枚举出来。

    接下来介绍一下如何枚举某个集合sup的子集。这里sup是一个二进制码,其本身也是某个集合的子集。例如给定了01101101这样的集合,要将01100000或者00101101等子集枚举出来。前面是从0开始不断加1来枚举出了全部的子集。此时,sub+1并不一定是sup的子集。而(sup+1)&sup虽然是sup的子集,可是很有可能依旧是sub,没有任何改变。

    所以我们要反过来,从sup开始每次减1,直到0为止。由于sub-1并不一定是sup 的子集,所以我们把它与sup进行按位与&,这样的话就可以将sup所有的子集按照降序列举出来。(sub-1)&sup会忽略sup中的0而从sub中减去1。

    int sub = sup; //子集
    do{
    sub = (sub - 1) & sup;
    }while(sub != sup); //处理完0以后,会有-1&sup = sup;

    最后我们介绍一下枚举{0,1,…,n-1}所包含的所有大小为k的子集的方法。通过使用位运算,我们可以像如下代码所示简单地按照字典序升序地美剧出所有满足条件的二进制码。

    int comb = (1<<k) - 1;
    while(comb < 1<<n)
    {
        //在这里进行针对组合的处理
        int x = comb & -comb, y = comb + x;
        comb = ((comb & -y) / x >> 1) | y;
    }

    按照字典序的话,最小的子集是(1《 k)-1,所以用它作为初始值。现在我们求出comb其后的二进制码。例如0101110之后的是0110011,0111110之后的是1001111。下面是求出comb下一个二进制码的方法。

    (1)求出最低位的1开始的连续的1的区间。
    (0101110 -> 0001110)
    (2)将这一区间全部变为0,并将区间左侧的那个0变为1。
    (0101110 -> 0110000)
    (3)将第一步里取出的区间右移,直到剩下的1的个数减少了一个。
    (0001110 -> 0000011)
    (4)将第二步和第三步中的结果按位取或(0110000|0000011 = 0110011)

    对于非零的整数, x&(-x)的值就是将其最低位的1独立出来后的值,这部部分内容在树状数组部分有详细讲解,这里就不赘述了。

    将最低位的1取出后,设它为x。那么通过计算y = comb + x,就将comb从最低位的1开始的连续的1都置零了。我们来比较一下~y和comb。在comb中加上x后没有变化的位,在~y中全都取相反的值。而最低位1开始的连续区间在~y中依然是1,区间左侧的那个0在~y中依然也是0.于是通过计算z = comb & ~y 就得到了最低位1开始的连续区间。比如:如果comb = 0101110,则 x = 0000010,y = 0110000,z = 0001110.
    同时,y也恰好是第二步要求的值。那么首先将z不断右移,直到最低位为1,这通过计算z/x即可完成。这样再将z/x右移1位,就得到了第三步要求的值。这样我们就求得了comb之后的下一个二进制列。因为是从n个元素的集合中进行选择,所以comb的值不能大于等于
    1*2^n,如此一来,就完成了大小为k的所有子集的枚举。

    除了上述例子之外,还可以利用位运算完成满足其他条件的集合的枚举,例如不包含相邻元素的集合等。

    展开全文
  • 集合{0,1,2…n-1}的子集可以用以下方式编码整数。 换而言之,一个二进制数的某一位上,如果这第i位是1,表示i属于这个集合,否则就不属于。这样表示之后,可进行如下操作: 空集..............................
  • 2.3我们介绍了无符号编码和补码编码,本次我们来看一下在这两种编码下,整数的运算是如何进行的。看后之余,别忘了“点个推荐哦。”   引言    平时的编程过程中,当进行整数运算时,经常会遇到一些奇怪的...
  •  在上一章中,我们着重介绍了整数的...本次我们来看一下二进制整数的扩展与截断,这部分内容是与C语言挂钩介绍的。因此我们首先来简单的看一下C语言的有符号数和无符号数。 C语言中的有符号数和无符号数 ...
  • 二进制编码

    千次阅读 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
  • 【基础】二进制编码

    千次阅读 2017-01-07 22:25:57
    意义xxxx几种编码及转换几种编码都需要懂,而且分情况。使用这些编码的基本前提,是确定单位,比如这里探讨的是一个字节,还是int(例如java中的...我们知道,1个字节的原码是支持正负127范围内的整数的,包括从-127到-
  • 二进制编码知识

    2016-05-17 20:18:12
    对于整型数据,二进制的表示为符号位+数值位,对于浮点型数据,十进制转二进制的方式如下将十进制浮点型数据转换为二进制时分别将整数部分和小数部分转化为二进制对于整数部分,每次除2取余直到商为0,第一个除法...
  • 原码,即二进制定点表示法:最高位为符号位,其余位表示数值的大小。 反码,为了解决减法运算错误而设计:正数的反码与其原码相同,负数的反码是对其原码数值部分逐位取反,符号位不变。 补码,为了解决...
  • 在计算机内部,所有信息都是用二进制数串的形式表示的。整数通常都有正负之分,计算机中的整数分为无符号的和带符号的。无符号的整数用来表示0和正整数,带符号的证书可以表示所有的整数。由于计算机中符号和数字...
  • 数据的表示与运算进位计数法进制转换任意进制转十进制十进制转任意进制2^n次方之间的转换二进制转其他 : n位一组其他转二进制 :1位拆n位数制与编码BCD码 +0110余3码 :BCD码基础上+00112421码:BCD吗对应权值改成2421...
  • Java课堂笔记(二) 常量 在程序运行过程中,其值不会发生变化的量。 分为字面值常量和自定义常量 字面值常量:整数常量,小数常量,字符... 二进制:0b-- 八进制:0-- 十进制:默认 十六进制:0x-- 使用println...
  • <p>I have written the function <code>FromBytes</code> which converts bytes to integer format and passes it to <code>IP4()</code> based on endianness as follows: <pre><code> type IP4 uint32 ...
  • 在进行编码之前,你要了解二进制是如何转换为十进制的。 二进制:由0和1组成。 十进制:由0值9组成。 二进制转十进制:用数值乘以2的幂次依次相加得到十进制。(幂次为从右至左的第n个数值-1) 分析: 一、 十...
  • 所有数据,字符串,整数等一切事物在计算机里,都是通过 0 和 1 来组成,也就是用二进制表示。二进制的特点就是「逢二进一」。同时为了应对负数,采用了补码表示法,即第一位既作为符号位,同时也参与运算。比如 4 ...
  • 与16进制数 A1.2等值的10进制数是( )A.101.2 B.111.4 C.161.125 D.177.252010普及1.2E+03表示 ( )A.2.03 B.5 C.8 D.20002009提高4、在字长为16位的系统环境下,一个16位带符号整数二进制补码为111111...
  • 向量化序列说明_将整数序列编码二进制矩阵 参考: http://www.pythonheidong.com/blog/article/187614/ import numpy as np t = np.array([1,2,3,4,5,6,7,8,9]) r = np.zeros((len(t), 10)) t array([1, 2, 3, 4,...
  • 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 解题: 首先,补充一下格雷码的含义...
  • 所有数据,字符串,整数等一切事物在计算机里,都是通过 0 和 1 来组成,也就是用二进制表示。二进制的特点就是「逢二进一」。同时为了应对负数,采用了补码表示法,即第一位既作为符号位,同时也参与运算。比如 4 ...
  • 十进制纯小数转换为二进制编码

    千次阅读 2013-09-10 15:13:54
    把0.1(或0.01)不断地乘以2,若整数部分是0,则这一位是0,若整数部分是1,遇这一位是1,然后用乘积的小数部分继续乘下去。 结果是: 0.1(10)=0.0001100110011……(2) 0.01(10)=0....
  • 十进制转二进制

    2019-09-24 21:52:31
    十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。 中文名十进制转二进制外文名Decimal to binary应用学科数学适用领域范围电子、编程、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,240
精华内容 896
关键字:

二进制整数编码