zoukankan      html  css  js  c++  java
  • 二进制整数及其表达方式

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

    原码

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

    • 二进制转换十进制

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


    • 十进制转二进制

    按照套路来,用"除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个二进制位,表示负数一定要确定有多少个二进制位):
    二进制反码 十进制整数
    0101 5
    0100 4
    0011 3
    0010 2
    0001 1
    0000 0
    1111 0
    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个二进制位能够表示的最小整数了。
    • 公式法得到反码
      想要用原码转换的方法得到一个数的反码吗?这样会让转换过程更加通用。看下面的公式:



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


    原文地址:https://www.jianshu.com/p/8314710ba093?from=singlemessage
  • 相关阅读:
    Alice and Bob 要用到辗转相减
    Java经典设计模式
    设计模式---创建类---建造者模式
    luogu4267 TamingtheHerd (dp)
    nowcoder172C 保护 (倍增lca+dfs序+主席树)
    nowcoder172A 中位数 (二分答案)
    bzoj4985 评分 (二分答案+dp)
    luogu4269 Snow Boots G (并查集)
    luogu4268 Directory Traversal (dfs)
    bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)
  • 原文地址:https://www.cnblogs.com/jpfss/p/11512978.html
Copyright © 2011-2022 走看看