精华内容
下载资源
问答
  • 关于二进制转10进制的按展开

    千次阅读 2021-05-14 11:30:40
    我的疑问点是:为什么其他进制展开就直接是10进制?? 简单的一句话就是因为的你的项结果 是用10进制表示 下面开始详解: 我们以 11111 为例子: 转为10进制的时候:1x24+1x23+1x22+1x21+1x20 = 31 16+8+4+2+...

    我的疑问点是:为什么其他进制按权展开就直接是10进制??

    简单的一句话就是因为的你的权项结果 是用10进制表示

    下面开始详解:
    在这里插入图片描述

    我们以 11111 为例子:
    转为10进制的时候:1x24+1x23+1x22+1x21+1x20 = 31
    16+8+4+2+1 = 15
    其中16+8+4+2+1的过程已经使用了十进制
    如果我们直接同八进制替换
    16 = 20
    8=10
    4=4
    2=2
    1=2
    1111转为8进制 20+10+4+2+1 = 37

    在这里插入图片描述
    用相同的方法 将十进制的115转为2进制的时候也能转
    115 = 1x102+1x101+5x100
    1010x1010 + 1010 +101 = 1110011

    在这里插入图片描述
    1010x1010的二进制计算

    实际就是在于当你使用什么进制来表示这个数。那么的你基数你的权 也都要是这个进制的数。

    展开全文
  • 数位进制转换详解

    千次阅读 2021-01-16 20:24:26
    十进制数:3765,如何转换成二进制数? 第一步,写出二进制的权数如下: 第十二 第十一 第十 第九 第八 第七 第六 第五 第四 第三 第二 第一 2048 1024 512 256 128 64 32 16 8 4 2...

    文章目录

    进制

    23678(10进制) = 2*10000+3*1000+6*100+7*10+8*1
                  = 2*10^4 + 3*10^3 + 6*10^2 + 7*10^1 + 8*10^0
                  = 23678
    

    如上例所示,10 称做"基数",10^n(10 的 n 次幂,n从0开始)被称作"权",10000 1000 100 10 1

    2进制的基数为2,权为2^n(2的n次方),128 64 32 16 8 4 2 1

    16进制的基数为16,权为 16^n(16的 n 次方),4096 256 16 1

    P.S 16进制的前缀是0X,数字零和英文字母X

    8进制的基数为8,权为 8^n(8的 n 次方),512 64 8 1

    P.S 8进制的前缀通常是数字0。

    在这里插入图片描述
    注意:10进制与其它进制的转换不能直接通过对照表的对应关系做简单的替换,没有这样的替换关系

    进制转换

    二进制和十进制互相转换

    十进制 → 二进制

    十进制正整数 → 二进制

    方法一(辗转减权法)

    十进制数:3765,如何转换成二进制数?

    第一步,写出二进制的权数如下:

    第十二位第十一位第十位第九位第八位第七位第六位第五位第四位第三位第二位第一位
    204810245122561286432168421

    注意:权数是以十进制数来表示的,相邻数是两倍的关系,最大的权数必须最接近被转换的十进制数(3765)

    第二步,计算下3765含有多少个二进制的权数

    3765 - 2048 = 1717,表示含有1个2048;
    1717 - 1024 = 693, 表示含有1个1024;
    693 - 512 = 181, 表示含有1个512;
    181 - 128 = 53, 表示含有1个128;
    53 - 32 = 21, 表示含有1个32;
    21 - 16 = 5, 表示含有1个16;
    5 - 4 = 1, 表示含有1个4;
    1 - 1 = 0, 表示含有1个1。

    那么我们按二进制的权数位置来标数,如下:

    \第十二位第十一位第十位第九位第八位第七位第六位第五位第四位第三位第二位第一位
    权数204810245122561286432168421
    二进制数111010110101

    结果:十进制数3765转换成二进制数是:1110101110101,计算机默认按int类型保存,所以实际应该是32位的二进制数:
    00000000 00000000 00001110 10110101

    方法二(辗转整除法/除2取余法)

    叫「辗转整除法」,十进制数转换成二进制数,那么就除以2,必须整除,得到“商数”继续除以2,直到“商数”为0,最后得到的余数逆序排列就是对应的二进制数了。也叫「除2取余,逆序排列法」。

    十进制数:12,如何转成二进制数?

    在这里插入图片描述
    说明:12 ➗ 2 = 6,余数0;6 ➗ 2 = 3,余数0;3 ➗ 2 = 1,余数1;1➗ 2 = 0,余数1

    十进制负整数 → 二进制

    -33转成二进制

    思路:先得到33的二进制数,然后取反+1得到-33的二进制数

    如果转成8位的二进制补码,计算过程如下:

    1. 33的二进制补码:0010 0001
    2. 取反得:1101 1110
    3. +1得:1101 1111

    最后得到-33的8位二进制码:1101 1111

    十进制负小数 → 二进制

    -0.98如何转换成二进制

    思路:
    先得到0.98的二进制数,然后取反+1得到-0.98的二进制数

    0.98通过乘2取整法,得到二进制数。

    十进制小数 → 二进制

    十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
    然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。

    例如:0.96875如何转换成二进制

    在这里插入图片描述

    二进制 → 十进制

    二进制负整数 → 十进制

    二进制数:11011111,如何转成十进制数呢?

    前提是要确认11011111是不是八位的二进制数(即byte类型),如果是byte类型,那么11011111肯定是负数,第一位表示符号,第一位为1表示负数,所以不能直接转换成十进制数,需要先得到正数的补码,再转换成十进制的正数,最后得到对应的负数。

    第一步,先得到正数的补码(即负数对应的正数的二进制数):
    取反+1
    11011111

    \二进制数
    负数11011111
    取反00100000
    +1得到补码00100001

    最后得到11011111对应的正数的补码:00100001

    第二步,正数补码转换成十进制数

    就是二进制数和对应的位置的权数相乘,最后求和,就可以得到十进制数。这个叫「按权相加法」。
    换个表述,正的二进制整数,第n位置的数乘以2^(n-1),最后求和,就可以得到十进制数。n由右到左,从1开始。

    \第八位第七位第六位第五位第四位第三位第二位第一位
    权数1286432168421
    二进制数00100001

    十进制数:0 * 128 + 0 * 64 + 1 * 32 + 0 * 16 +0 * 8 + 0 * 4 + 0 * 2 + 1 * 1 = 33

    第三步,既然11011111对应的十进制正数是33,那么11011111对应的十进制负数就是-33

    说明:

    1. 所谓补码,其实就是二进制数,需遵循特定的二进制运算规则(即在封闭的位数范围内运算,举例:1111+0001 = 10000,若按4位补码运算,要把1舍弃,才能得到正确的结果0000,对照「二进制补码表」可知,计算结果正好和十进制的-1+1=0的运算结果一致);
    2. 计算机中正的二进制数和负的二进制数的关系是取反+1。例如:二进制八位补码00000111(7),对应的负数补码就是对正数的二进制数(也就是补码)取反+1,得到11111001(-7)。而二进制负数11111001对应的二进制正数,也是对负数11111001取反+1得到00000111
    3. 计算机内部数据是以二进制补码来表示;
    4. 补码的负数最高位是1,补码的正数最高位是0,最高位也称为“符号位”。

    二进制的正整数 → 十进制

    二进制数:11011111,如何转成十进制数呢?

    前提是要确认这个二进制数的类型,如果是byte类型按上述流程来进行转换,如果是short(16位),int(32位),long(64位)等类型的,那么说明前面都是0,给省略了,说明是正数,可以直接转换成十进制数,也就是才有「按权相加法」得到十进制数。

    \第八位第七位第六位第五位第四位第三位第二位第一位
    权数(位权)1286432168421
    二进制数11011111

    十进制数:1 * 128 + 1* 64 + 0 * 32 + 1 * 16 +1 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 223

    二进制小数 → 十进制

    二进制的小数位则从左向右开始算,依次列为第1、2、3………n,然后将第n位的数乘以2的-n次方,然后相加即可得到小数位的十进制数(按权相加法)。

    111.01如何转换成十进制数?

    将二进制数据111.01写成加权系数的形式:
    1 * 22+ 1 * 21+1 * 20 + 0 * 2-1 + 1 * 2-2 = 7.25
    答:二进制111.01 转换成十进制7.25

    0.11111,如何转换成十进制数呢?

    1 * 2-1 + 1 * 2-2 + 1 * 2-3 + 1 * 2-4 + 1 * 2-5 = 0.96875
    答:二进制0.11111转换成十进制0.96875

    二进制的负小数 → 十进制

    思路:
    通过二进制的负小数取反+1得到对应的二进制的正小数,然后计算出正小数的十进制数,最后看得到对应的十进制负数,这个负数就是二进制负小数转换十进制的结果值。

    八进制和十进制的转换

    Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。

    十进制 → 八进制

    十进制正整数 → 八进制

    方法一:叫「辗转整除法」,也叫「除8取余法」
    十进制数转换成八进制数,就是拿十进制数除以8,必须整除,得到的“商数”继续除以8,直到“商数”为0,最后得到的余数逆排序就是对应的8进制数了。

    将十进制数115转化为八进制数

    在这里插入图片描述
    结果:(115)10 = (163)8

    方法2:先将十进制数转换成二进制数,再将二进制数化为八进制数

    十进制数115转换成八进制数是多少呢?

    (115)10 = (1110011)2 = (001 110 011)(163)8

    十进制数-2转换成八进制是多少呢?

    先得到2的二进制数:00000000000000000000000000000010
    取反+1得到-2的二进制数:11111111111111111111111111111110
    转换为8进制 :37777777776

    十进制负整数 → 八进制

    思路:
    十进制负数 → 二进制数 → 八进制

    -2 的二进制数:11111111 11111111 11111111 1111110
    转成八进制:37777777776

    十进制小数 → 八进制

    将十进制数(0.3125)10转换成八进制数。

    「乘8取整法」

    十进制小数转换成八进制小数采用"乘8取整,顺序排列"法。具体做法是:用8乘十进制小数,可以得到积,将积的整数部分取出,再用8乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
    然后把取出的整数部分按顺序排列起来,先取的整数作为八进制小数的高位,后取的整数作为低位,这样由各整数部分组成的数字就是转化后八进制小数的值。

    0.3125x8 = 2 .5 2
    0.5x8 = 4 .0 4
    结果:(0.3125)10=(0.24)8

    十进制的负小数 → 八进制

    思路:
    先得到对应的十进制正小数,十进制的正小数转成二进制的正小数,再取反+1得到二进制的负小数,这个就是十进制的负小数转换成二进制的结果,然后把二进制负小数,三对一换成八进制数值即可。

    八进制 → 十进制

    八进制的正整数 → 十进制

    就是八进制数和对应的位置的权数相乘,最后求和,就可以得到十进制数。这个叫「按权相加法」。
    8进制的权数:80,81,82 ……

    将八进制数12转换成十进制数

    在这里插入图片描述

    将八进制数(751)8转换成十进制数

    (751)8=(7x82+5x81+1x80)10=(448+40+1)10=(489)10

    八进制的小数 → 十进制数

    小数位则从左向右开始算,依次列为第1、2、3………n,然后将第n位的数乘以8的-n次方,然后相加即可得到小数位的十进制数(按权相加法)。

    八进制的0.16转换成十进制是多少?

    (0.16)8=(1x8-1+6x8-2)10=(0.125+0.09375)10=(0.21875)10

    P.S 括号外的数字是注释是多少进制的数,本来是应该打底标,但是CSDN不行

    八进制的负整数 → 十进制

    思路:
    八进制负数转成二进制数,再转成十进制数

    (37777777776) 8 = (11 111 111 111 111 111 111 111 111 111 110) 2

    对11111111 11111111 11111111 1111110
    取反+1,得到对应的正数补码:
    00000000 00000000 00000000 00000010 ,而这个正数补码对应的十进制是2,所以11111111 11111111 11111111 1111110 对应的十进制数是-2,最后得到(37777777776) 8对应的十进制是-2

    八进制的负小数 → 十进制

    思路:
    八进制负小数转成二进制负小数,取反+1得到二进制正小数,再得到十进制的正小数,再得到十进制的负小数,这个十进制负小数就是八进制负小数转换成十进制的结果值

    十六进制和十进制的转换

    十六进制 → 十进制

    十六进制正整数 → 十进制

    将十六进制数(A7)16转换成十进制数

    「按权相加法」

    十六进制的权数(从右到左):160,161,162

    (A7)16=(10x161+7x160)10=(160+7)10=(167)10

    0x7fbe转成十进制数

    0x7fbe这个数是int类型,前面的0省略了,这是个正数,直接「按权相加」得到十进制数:
    7 * 163 + 15 * 162 + 11 * 161 +14 * 160 = 32702

    十六进制小数 → 十进制

    以小数点为界,整数位从右向左开始算,依次列为第1、2、3………n,然后将第n位的数(0-9,A-F)乘以16的n-1次方,然后相加即可得到整数位的十进制数;小数位则从左向右开始算,依次列为第1、2、3………n,然后将第n位的数(0-9,A-F)乘以16的-n次方,然后相加即可得到小数位的十进制数(按权相加法)。

    将十六进制数(0.D4)16转换成十进制数

    (0.D4)16=(13x16-1+4x16-2)10=(0.8125+0.015625)10=(0.828125)10

    十六进制负整数 → 十进制

    十六进制的负数,从字面量来看,不好直接看不出来到底是负数还是正数,而如果是负数,又不能直接通过「按权相加法」计算得到十进制数,所以保险起见,最好把十六进制的数先转换成二进制数,然后通过二进制数的符号来判断是否负数。

    0xffffffdf转成十进制是多少?

    1. 先转成二进制:11111111 11111111 11111111 11011111
    2. 再得到对应正数的二进制:00000000 00000000 00000000 00100001,转成十进制:33
    3. 所以11111111 11111111 11111111 11011111对应的十进制是-33,也就是说0xffffffdf对应的十进制是-33

    十六进制负小数 → 十进制

    思路:
    先转成二进制补码,如果确定是负数,取反+1,得到对应的正数补码,正数补码转成十进制数,这个十进制的正数加个“负号”,就是十六进制负小数转换成十进制的结果值。

    十进制 → 十六进制

    十进制正整数 → 十六进制

    「除16取余法」:十进制数转换成十六进制数,就是拿十进制数除以16,必须整除,得到的“商数”继续除以16,直到“商数”为0,最后得到的余数逆排序就是对应的16进制数了。

    将十进制数(93)10转换成十六进制数

    93/16=5………13(D)

    5/16 = 0… … 5

    (93)10=(5D)16

    十进制小数 → 十六进制

    「乘16取整法」
    十进制小数转换成16进制小数采用"乘16取整,顺序排列"法。具体做法是:用16乘十进制小数,可以得到积,将积的整数部分取出,再用16乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
    然后把取出的整数部分按顺序排列起来,先取的整数作为16进制小数的高位,后取的整数作为低位,这样由各整数部分组成的数字就是转化后16进制小数的值。

    将十进制数(0.3125)10转换成十六进制数

    0.3125x16 = 5 .0

    (0.3125)10=(0.5)16

    十进制负小数 → 十六进制

    -15.8转成十六进制是多少?

    思路:
    先得到-15.8的二进制数,再转成十六进制数

    1. 得到15.8的二进制数:
      整数通过「除2取余法」获得,小数通过「乘2取整法」得
    2. 取反+1得到-15.8的二进制数
    3. 最后根据“十六进制与二进制的转换关系表”,四位为一组替换成十六进制的值

    十进制负整数 → 十六进制

    -33转成十六进制是多少?

    十进制的负数不能通过「除以16取余法」来转换成十六进制。
    必须先得到-33的二进制补码:1101 1111,最后根据“十六进制与二进制的转换关系表”,四位为一组替换成十六进制的值,最后得到结果:0xdf。但是这样的结果是正确的吗??-33 = 0xdf 吗??

    分析下0xdf
    字面量默认是int类型,32位,而0xdf只有8位,显然是省略前面的0了,那么显然这是个正数(前面提到不好直接看出来是否负数,可以转成二进制判断是否负数),可以直接通过「按权相加法」得到对应的十进制数:0xdf = 0x000000df = 13 * 16^1^+15 * 16^0^ = 208 + 15 = 223,所以0xdf != -33

    也就是说不论是-33还是0xdf,计算机都是当成int类型的数值,所以-33转成二进制补码应该是32位的,就是:11111111 11111111 11111111 11011111,那么转成十六进制数就是:0xffffffdf。而0xdf转成二进制数是:00000000 00000000 00000000 11011111

    总结:
    -33计算机认为是一个int类型的数值,会以32位的二进制表示:11111111 11111111 11111111 11011111,转成十六进制就是:0xffffffdf
    0xdf计算机认为是一个int类型的数值,转成二进制是:00000000 00000000 00000000 11011111,转成十进制是:223

    实质上-33如果表示成8位的二进制补码,再转成十六进制的确是0xdf,只不过计算机不这么干,而0xdf转成8位二进制补码,再转成十进制确实是-33,只是计算机不这么干。

    所以0xdf

    • 对应8位的二进制补码而言,转成十进制是-33
    • 对应32位的二进制补码而言,转成十进制223

    所以-33

    • 对应8位的二进制补码而言,转成十六进制是0xdf
    • 对应32位的二进制补码而言,转成十六进制是0xffffffdf

    如果要把0xdf按8位的二进制补码运算,需要强制类型转换:

    byte b = (byte)0xdf;
    System.out.println(b); // 结果输出 -33
    

    二进制和八进制的转换

    八进制 → 二进制

    二进制与八进制的互相转换和二进制与十六进制的转换类似,区别在于需要操作的是三位一组而不是四位。下表2-2列出了二进制与八进制的等效表示。
    在这里插入图片描述

    八进制正整数 → 二进制

    八进制123换算成二进制的结果是多少?

    为了把八进制数换算为二进制,将每一个八进制数字替换成表2-2中对应的二进制三位:

    在这里插入图片描述

    将八进制数(751)8转换成二进制数

    (751)8=(7 5 1)8=(111 101 001)2=(111101001)2

    八进制小数 → 二进制

    8进制17.36如何转换成二进制

    规则:按照顺序,每1位八进制数改写成等值的3位二进制数,次序不变。

    (17.36)8 = (001 111 .011 110)2 = (1111.01111)2

    将八进制数(0.16)8转换成二进制数

    (0.16)8=(0. 1 6)8=(0. 001 110)2=(0.00111)2

    八进制负整数 → 二进制

    (37777777776) 8怎么转换成二进制

    根据对照表将八进制的数逐一替换二进制数
    (37777777776) 8 = (11 111 111 111 111 111 111 111 111 111 110) 2

    八进制的负小数 → 二进制

    思路:
    根据对照表将八进制的数逐一替换二进制数即可

    二进制 → 八进制

    表述一:
    整数部份从最低有效位开始,以3位一组,最高有效位不足3位时以0补齐,每一组均可转换成一个八进制的值,转换完毕就是八进制的整数。
    小数部份从最高有效位开始,以3位一组,最低有效位不足3位时以0补齐,每一组均可转换成一个八进制的值(表2-2查找对应的八进制值),转换完毕就是八进制的小数。

    表述二:
    因为每三位二进制数对应一位八进制数,所以,以小数点为界,整数位则将二进制数从右向左每3位隔开,不足3位的在左边用0填补即可;小数位则将二进制数从左向右每3位隔开,不足3位的在右边用0填补即可。

    二进制的正整数 → 八进制

    将二进制数(10010) 2转化成八进制数是多少?

    (10010)2=(010 010)2=(2 2)8=(22)8

    二进制小数 → 八进制

    例1:将二进制数(0.1010)2转化为八进制数。
    (0.10101)2=(0. 101 010)2=(0. 5 2)8=(0.52)8

    例2:将二进制数(11001111.01111)2 转化成八进制数。(11001111.01111)2 = (011 001 111.011 110)2 = (317.36)8

    二进制负整数 → 八进制

    16位二进制补码11111111 11110110 转换成八进制

    参照表2-2,将二进制的三位替换成对应的八进制数值即可。
    (1111111111110110 ) 2 = (001 111 111 111 110 110) 2 = (177766) 8

    二进制的负小数 → 八进制

    思路:
    根据对照表将二进制的数逐一替换八进制数

    二进制和十六进制的转换

    二进制和十六进制的对照表
    在这里插入图片描述

    二进制 → 十六进制

    因为每四位二进制数对应一位十六进制数,所以,以小数点为界,整数位则将二进制数从右向左每4位隔开,不足4位的在左边用0填补即可;小数位则将二进制数从左向右每4位隔开,不足4位的在右边用0填补即可。

    二进制正整数 → 十六进制

    0111 1101转成十六进制数

    不要管是否负数,直接根据对照表,4个二进制数对1个十六进制数,逐一替换即可。
    (0111) 2 →(7)10 → (7)16
    (1101)2 → (13)10 → (d)16
    所以0111 1101 → 0x7d

    其实不需要转成十进制再转成十六进制,因为对照表已经展示了二进制和十六进制的对应关系。

    将二进制数(10010)2转化成十六进制数

    (10010)2 =(0001 0010)2 = (12) 16

    二进制负整数 → 十六进制

    1111 1101转成十六进制数

    1111 转 f,1101 转 d,结果0xfd。

    二进制小数 → 十六进制

    将二进制数(0.1010)2转化为十六进制数

    (0.10101)2=(0. 1010 1000)2=(0. A 8)16=(0.A8)16

    二进制负小数 → 十六进制

    直接根据对照表,4个二进制数对1个十六进制数,逐一替换即可。

    十六进制 → 二进制

    十六进制的正整数 → 二进制

    将十六进制数(A7)16转换成二进制数

    0xa7,默认是int类型,前面0省略,肯定是正数,转换的时候不必理会是否负数,直接转即可

    (A7)16=(A 7)16=(1010 0111)2=(10100111)2,注意这里不是8位的补码,只是前面的0省略调了,这里可不是个负数,实际对应的十进制数是167。

    0x7fd3 转成二进制数

    7 转 0111
    f 转1111
    d 转 1101
    3 转 0011

    结果:01111111 11010011

    十六进制的负整数 → 二进制

    根据对照表直接转即可

    十六进制的小数 → 二进制

    将十六进制数(0.D4)16转换成二进制数

    根据对照表直接转即可

    (0.D4)16=(0. D 4)16=(0. 1101 0100)2=(0.110101)2

    十六进制的负小数 → 二进制

    根据对照表直接转即可

    八进制和十六进制的转换

    十六进制 → 八进制

    先将十六进制转换成二进制,然后再转换成八进制

    十六进制正整数 → 八进制

    将十六进制数(A7)16转换成八进制数

    (A7)16=(10100111)2=(010 100 111)2=(247)8

    十六进制小数 → 八进制

    将十六进制数(0.D4)16转换成八进制数

    (0.D4)16=(0.1101 0100)2=(0. 110 101)2=(0.65)8

    十六进制负整数 → 八进制

    直接转成二进制,再转成八进制

    十六进制负小数 → 八进制

    直接转成二进制,再转成八进制

    八进制 → 十六进制

    八进制的正整数 → 十六进制

    直接转成二进制,再转成十六进制

    将八进制数(751)8转换成十六进制数

    (751)8=(111 101 001)2=(0001 1110 1001)2=(1 E 9)16=(1E9)16

    八进制的正小数 → 十六进制

    将八进制数(0.16)8转换成十六进制数

    (0.16)8=(0.001 110)2=(0. 0011 1000)2=(0.38)16

    八进制的负整数 → 十六进制

    根据「八进制与二进制对照表」转成二进制,再根据「十六进制与二进制对照表」转成十六进制

    八进制的负小数 → 十六进制

    根据「八进制与二进制对照表」转成二进制,再根据「十六进制与二进制对照表」转成十六进制


    参考资料

    展开全文
  • 整数的二进制表示与运算.png十进制要理解整数的二进制,我们先来看下熟悉的十进制。十进制是如此的熟悉,我们可能已忽略了它的含义。比如123,我们不假思索就知道它的值是多少。但其实123表示的1(10^2) + 2(10^1) ...

    f8228377f105

    整数的二进制表示与位运算.png

    十进制

    要理解整数的二进制,我们先来看下熟悉的十进制。十进制是如此的熟悉,我们可能已忽略了它的含义。比如123,我们不假思索就知道它的值是多少。

    但其实123表示的1(10^2) + 2(10^1) + 3*(100),(102表示10的二次方),它表示的是各个位置数字含义之和,每个位置的数字含义与位置有关,从右向左,第一位乘以10的0次方,即1,第二位乘以10的1次方,即10,第三位乘以10的2次方,即100,依次类推。

    换句话说,每个位置都有一个位权,从右到左,第一位为1,然后依次乘以10,即第二位为10,第三位为100,依次类推。

    正整数的二进制表示

    正整数的二进制表示与此类似, 只是在十进制中,每个位置可以有10个数字,从0到9,但在二进制中,每个位置只能是0或1。位权的概念是类似的,从右到左,第一位为1,然后依次乘以2,即第二位为2,第三位为4,依次类推。

    看一些数字的例子吧:

    f8228377f105

    image.png

    负整数的二进制表示

    十进制的负数表示就是在前面加一个负数符号-,例如-123。但二进制如何表示负数呢?

    其实概念是类似的,二进制使用最高位表示符号位,用1表示负数,用0表示正数。

    但哪个是最高位呢?整数有四种类型,byte/short/int/long,分别占1/2/4/8个字节,即分别占8/16/32/64位,每种类型的符号位都是其最右边的一位。

    为方便举例,下面假定类型是byte,即从右到左的第8位表示符号位。

    但负数表示不是简单的将最高位变为1,比如说:

    byte a = -1,如果只是将最高位变为1,二进制应该是10000001,但实际上,它应该是11111111。

    byte a=-127,如果只是将最高位变为1,二进制应该是11111111,但实际上,它却应该是10000001。

    和我们的直觉正好相反,这是什么表示法?这种表示法称为补码表示法,而符合我们直觉的表示称为原码表示法,补码表示就是在原码表示的基础上取反然后加1。取反就是将0变为1,1变为0。

    负数的二进制表示就是对应的正数的补码表示,比如说:

    -1:1的原码表示是00000001,取反是11111110,然后再加1,就是11111111。

    -2:2的原码表示是00000010,取反是11111101,然后再加1,就是11111110

    -127:127的原码表示是01111111,取反是10000000,然后再加1,就是10000001。

    给定一个负数二进制表示,要想知道它的十进制值,可以采用相同的补码运算。比如:10010010,首先取反,变为01101101,然后加1,结果为01101110,它的十进制值为110,所以原值就是-110。

    byte类型,正数最大表示是01111111,即127,负数最大表示是10000000,即-128,表示范围就是 -128到127。其他类型的整数也类似,负数能多表示一个数。

    负整数为什么采用补码呢?

    负整数为什么要采用这种奇怪的表示形式呢?原因是:只有这种形式,计算机才能实现正确的加减法。

    计算机其实只能做加法,1-1其实是1+(-1)。如果用原码表示,计算结果是不对的。比如说:

    f8228377f105

    image.png

    用符合直觉的原码表示,1-1的结果是-2。

    如果是补码表示:

    f8228377f105

    image.png

    结果是正确的。

    再比如,5-3:

    f8228377f105

    image.png

    结果也是正确的。

    就是这样的,看上去可能比较奇怪和难以理解,但这种表示其实是非常严谨和正确的,是不是很奇妙?

    理解了二进制加减法,我们就能理解为什么正数的运算结果可能出现负数了。当计算结果超出表示范围的时候,最高位往往是1,然后就会被看做负数。比如说,127+1:

    f8228377f105

    image.png

    计算结果超出了byte的表示范围,会被看做-128。

    十六进制

    二进制写起来太长,为了简化写法,可以将四个二进制位简化为一个0到15的数,10到15用字符A到F表示,这种表示方法称为16进制,如下所示:

    f8228377f105

    image.png

    可以用16进制直接写常量数字,在数字前面加0x即可。比如10进制的123,用16进制表示是0x7B,即123 = 7*16+11。给整数赋值或者进行运算的时候,都可以直接使用16进制,比如:

    int a = 0x7B;

    Java中不支持直接写二进制常量,比如,想写二进制形式的11001,Java中不能直接写,可以在前面补0,补足8位,为00011001,然后用16进制表示,即 0x19。

    查看整数的二进制和十六进制表示

    在Java中,可以方便的使用Integer和Long的方法查看整数的二进制和十六进制表示,例如:

    int a = 25;

    System.out.println(Integer.toBinaryString(a)); //二进制

    System.out.println(Integer.toHexString(a)); //十六进制

    System.out.println(Long.toBinaryString(a)); //二进制

    System.out.println(Long.toHexString(a)); //十六进制

    位运算

    位运算是将数据看做二进制,进行位级别的操作,Java不能单独表示一个位,但是可以用byte表示8位,可以用16进制写二进制常量。比如: 0010表示成16进制是 0x2, 110110表示成16进制是 0x36。

    位运算有移位运算和逻辑运算。

    移位有:

    左移:操作符为<

    无符号右移:操作符为>>>,向右移动,右边的舍弃掉,左边补0。

    有符号右移:操作符为>>,向右移动,右边的舍弃掉,左边补什么取决于原来最高位是什么,原来是1就补1,原来是0就补0,将二进制看做整数,右移1位相当于除以2。

    例如:

    int a = 4; // 100

    a = a >> 2; // 001,等于1

    a = a << 3 // 1000,变为8

    逻辑运算有:

    按位与 &:两位都为1才为1

    按位或 |:只要有一位为1,就为1

    按位取反 ~: 1变为0,0变为1

    按位异或 ^ :相异为真,相同为假

    大部分都比较简单,就不详细说了。具体形式,例如:

    int a = ...;

    a = a & 0x1 // 返回0或1,就是a最右边一位的值。

    a = a | 0x1 //不管a原来最右边一位是什么,都将设为1

    写在最后

    都看到这里,保存思维导图,顺便给个赞呗

    展开全文
  • 十进制数转化为二进制数的两种方法

    万次阅读 多人点赞 2020-12-29 21:14:52
    如果我们要把十进制的150转化为二进制数,可以使用下面两种方法: 第一种方法:表格法 这种方法的核心思想就是用二进制的各位来“拼凑”出我们的十进制数。 我们先把二进制各位的位权列在表格里面。(我们如何...

    如果我们要把十进制的150转化为二进制数,可以使用下面两种方法:

    第一种方法:表格法

    这种方法的核心思想就是用二进制的各位来“拼凑”出我们的十进制数。

    我们先把二进制各位的位权列在表格里面。(我们如何知道要列多少位出来呢?其实我们就是要列到比150小并且最接近150的那一位,也就是列到128就可以了。)

    1286432168421
            

     

     

     

     然后我们从左往右看,如果需要使用这一位去拼凑150这个数,就在那一位的下方写上1,反之,写0.

    128是最接近150的,必然要用到。所以表格变成了下面的样子: 

    1286432168421
    1       

     

     

     

    然后,我们从150里面把128减掉,剩下的是22。我们发现64和32都比22大,那么这两位就用不到,记上0.

    1286432168421
    100     

     

     

     

    16比22小,需要使用,记上1.

    1286432168421
    1001    

     

     

     

    把16从22里减掉,得到6。8比6大,用不到,记上0.

    1286432168421
    10010   

     

     

     

    4比6小,需要使用,记上1.

    1286432168421
    100101  

     

     

     

    把4从6里减掉,得到2. 正好下一位的2可以使用,记为1。至此,就完成了拼凑,所以最后的1也用不上了,记为0.

    1286432168421
    10010110

     

     

     

    表格第二行连起来是10010110,它就是十进制的150在二进制中的表示。

    这种方法的优点是比较容易理解,缺点是有些麻烦。如果数字很大,表格需要列得很长。

    第二种方法:除基取余法

    第一步,150除以2,商75,余0;

    第二步,75除以2,商37,余1;

    第三步,37除以2,商18,余1;

    第四步,18除以2,商9,余0;

    第五步,9除以2,商4,余1;

    第六步,4除以2,商2,余0;

    第七步,2除以2,商1,余0;

    第8步,1除以2,商0,余1.

    组合的时候,一定要记得最后得到的余数是二进制中的最高位。所以我们要倒着组合,得到10010110.

    可能这种方法一开始不是那么好理解,可以对比我们熟悉的十进制数。如果我们有一个十进制数168,第一次除以10,商16,余8,这就相当于我们把个位的8(最低位)给“脱”下来了;第二次,16除以10,商1,余6,这就相当于把十位的那个6给“脱”下来了;然后再用1除以10,商0,余1,这就相当于把百位的1给“脱”下来了。所以我们这一路得到的余数,是从低位到高位的数字。那么二进制里,也是同样的道理。

    使用这种方法,还是比较便捷的,只要计算的时候细心一些就好了。

     

    如果这篇博文帮到了你,就请给我点个吧(#^.^#)

    有疑问也欢迎留言~博主可nice啦,在线秒回ヾ(◍°∇°◍)ノ゙

     

    展开全文
  • 2007-04-06二进制二进制怎么理解~!二进制18世纪德国数理哲学大师莱布尼兹从他的传教士朋友鲍威特寄给他的拉丁文译本《易经》中,读到了八卦的组成结构,惊奇地发现其基本素数(0)(1),即《易经》的阴爻- -和__阳爻,...
  • 分析:将二进制转化为十进制,只要将二进制数的每一乘以该然后相加 */ #include "iostream" using namespace std; //计算x的n次方 double power(double x,int n); int main() { int value=0; cout&...
  • 1 在计算机中为什么使用二进制数在计算机中,广泛采用的是只有"0"和"1"两个基本符号组成的二进制数,而不使用人们习惯的十进制数,原因如下:(1)二进制数在物理上最容易实现。例如,可以只用高、低两个电平表示"1"和...
  • ,|这种大量的运算,因此想要读明白这部分代码,对于计算机的二进制操作以及运算是必须要了解的,那么本篇我们就开始详细的学习二进制操作以及运算整数的二进制运算要理解整数的二进制,我们先来看看最熟悉的...
  • 学习笔记-各进制数位相互转化
  • 展开全部1101.1转换32313133353236313431303231363533e78988e69d8331333365633938为10进制为13.5进制转换是人们利用符号来计数的方法...位权是指,进位制中每一固定位置对应的单位二进制数转换为十进制数二进制数第...
  • 二进制数转换成十进制数只需每展开:(1001001)2=1×2^6 + 0×2^5 + 0×2^4 + 1×2^3 + 0×2^2 + 0×2^1 + 1×2^0= 64 + 0 + 0 + 8 +0+ 0 + 1= 73二进制转换为其他进制:(1)二进制转换成十进制:基数乘以,...
  • 详解计算机内部存储数据的形式—二进制数 前言 要想对程序的运行机制形成一个大致印象,就要了解信息(数据)在计算机内部是以怎样的形式来表现的,又是以怎样的方法进行运算的。在 C 和 Java 等高级语言编写的 程序...
  • 计算机中常用的计数制用若干数位(由数码表示)的组合去表示一个数,各个数位之间是什么关系,即逢“几”进位,这就是进位计数制的问题。也就是数制问题。数制,即进位计数制,是人们利用数字符号按进位原则进行数据...
  • 进制转换与运算

    2021-05-23 06:09:16
    二进制“001”为例, 每一都是一个bit。二进制只能由0/1组成,所以正好可以表示bit。什么是byte1个bit只能表示两种信号或者两种状态,表示的范围很小,例如英文字母26个就无法表示。所以规定8个bit一组作为一个...
  • 1、计算机的数制介绍数制:计数的方法,指用一组固定的符号和统一的规则来表示数值的方法数位:指数字符号在一个数中所处的位置基数:指在某种进位计数制中,数位上所能使用的数字符号的个数位权:指在某种进位计数...
  • 二进制数 01100011 转换成的十进制数是什么?二进制数 01100011 转换成的十进制数是99。拓展:进制转换进制转换是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指...
  • 十进制转二进制

    2021-06-24 12:40:04
    十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。中文名十进制转二进制外文名Decimal system to binary system适用领域电子、编程、编码...
  • 交替位二进制数

    2021-05-01 15:42:52
    给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两的数字永不相同。 示例 1: 输入:n = 5 输出:true 解释:5 的二进制表示是:101 示例 2: 输入:n = 7 输出...
  • python 把16进制字符串转化为16进制数字, 比如‘0x小编不希望有...(python)如何让python的16进制运算的输出格式为16进制而不...a='0x0012e' b= hex(eval(a)) print b 输出 0x12e 注意,一般计算机的十六进制数直接...
  • 二进制文件c语言操作分享到:------解决方案--------------------调试通过的版本://有一个二进制文件,要求每隔50bits,删除后面的12bits。#include#include#includeFILE*fi,*fo;charbuf[31];cha...
  • 8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问...将二进制数各数位的值和位权相乘后再相加, 即可转换成为十进制数.92二进制数00001111左移两位后, 会变成原数的几倍?4倍二进制数左移1位后会变成原...
  • 二进制计算

    千次阅读 2021-07-21 05:31:49
    虽然很早就接触了二进制,却一直没有正视这个问题,阅读《计算机科学导论》的时候,基本上是跳过了这一部分,总是以“这么基础的东西,反正工作中基本用不上”的理由给搪塞过去。最近正在阅读《编码》和《程序员的...
  • 八进制:在八进制数中,每一用0—7八个数码表示,所以它的计数基数为8。低位数和高一位数之间的关系是逢八进一。 十六进制:十六进制数的基数是16,采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F...
  • 二进制和十进制的转换and运算

    千次阅读 2021-01-30 11:02:13
    1.将二进制数转换成十进制 转换规则: 展开位权进行求和运算 100110 1x2^5+0x2^4+0x2^3+1x2^2+1x2^1+0x2^0 1x32+0x16+0x8+1x4+1x2+0x1 32+0+0+4+2+0 结果=38 2.将十进制转换为二进制 转换规则:除2取余直至运算结果...
  • 2进制转8进制(二进制转8进制公式)

    千次阅读 2021-07-31 01:50:55
    001,分别向左右每三位二进制数合成. 或每一八进制数展成三位二进制数.告诉你一个简单的道理 1.不论什么进制----十进制 都是基数乘位置的次方数 例如: 二进制1010---十进制就是: 1*2^3 0*2^2 1*2^1 0*2^0=10 八...
  • 计算机中十进制转换为二进制的另一方法-------“定位减权法”胡燏(四川建筑职业技术学院计算机系,618000)【摘要】本文从十进制与二进制的特点入手,介绍一种把十进制数转换为二进制的新方法。【关键字】十进制 ...
  • 【C语言】十进制转换二进制

    千次阅读 2021-06-25 09:35:40
    本题要求实现一个函数,将正整数n转换为二进制后输出。 函数接口定义: void dectobin( int n ); 函数dectobin应在一行中打印出二进制的n。建议用递归实现。 裁判测试程序样例: #include <stdio.h> ...
  • 话题:二进制中的3可以表示几种状态?问题详情:2.二进制中的3可以表示()。 A)两种状态 B)四种状态 C)回答:C 二进制的一只能表示两种状态,3是2的3次方种状态了,这是有史以来最垃圾的问题了! 分析打出来的是2...
  • 一、十进制整数转其它进制(除基取余法) 二、十进制小数转其它进制(乘基取整法) 三、十六进制转二进制 四、八进制转二进制

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,297
精华内容 22,518
关键字:

二进制各数位的权