二进制的那些事

一:关于二进制码相关概念:

  原码: 计算机中对数字的二进制定点表示方法。它在数值前面增加了一们符号位,用于表示 正数和负数。

  反码(~): 计算机中对数字的二进制定点表示方法,它是相对于原码来说,正数的反码是自己本身,负数的反码是其原码中的各位码取反(除最高位), (0 取反 1 ,1 取 反得0)。

  补码:计算机中对数字的二进制定点表示方法,正数的补码是自己本身,负数的补码是 其反码 + 1,最高位不变。

PS: 综上所述,原码,反码,补码 都是计算机对数字的二进制定点表示,但它们有着各自的优缺点,如下:  

    原码:适合作加法操作,但面对减法出现问题,不能做减法操作。

    反码:用于计算减法,描述负数,但存在 +0 和 -0 的情况

    补码:可以多描述一个最小负数,解决了2个0的问题,一般的语言都采用补码 表示数。

二:二进制与其它进制的转换:

      2.1  2,8,16 进制转换成10 进制:

          通过展开,每位乘以权重 ,最后 相加,例如:

         1101 ——> 1*2^3 + 1*2^2 + 0*2^1 +1*2^0 = 8 + 4 + 0 + 1 = 13

      2.2 10进制转换成 2,8,16 进制:

       将 10 进制数除以 要转换的进制,每除一次,取出余数,直到商小于除数时,从后往前取余数,就能得到相应的进制数,如下图:

   思考:10进制小数,转二进制怎么处理?

   首先将小数分为二个部分,整数部分请见 上面 ,小数处理方法:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又 得到一个积,再将积的整数部分取出,如此进行,直到积中的整数部分为零,或者整数部分为1,此时0或1为二进制的最后一位。或者达到所要求的精度为止。 

最后将整数与小数部分组合 ,中间用小数点间隔。

2.3  2进制 与 8进制,16进制 的转换:

    首先大家要清楚,一个8进制数,必须要用 3个 2进制数 才能表示完整, 一个 16进制 必须 要4个 2进制数 才能表示完整。所以我们在处理2进制转换成 8进制时,通常是将 2进制 拆成 3个2进制数(针对8进制) 或者 4个2进制数(针对16进制),然后将将拆分的 2进制数 与 相应 进制数 一一对应,再按顺序组合就可以得到相应的进制数了。如下图:

    2.4  8进制,16进制 与 2进制 的转换: 

      根据2.3 的原理,3个二进制数构成 1个8进制,4个二进制数构成一个16进制,那么现在 8进制 ,16进制转 2进制操作,就是上面操作的逆向,具体操作如下图:

2.5  其余进制之间转换,可以先将相应进制先转换成二进制做为中转,再进行转换

2.6  关于进制之间的转换总结:

    总结:

  1. 2,8,16 进制转换成10 进制,通过展开,每位乘以权重 ,最后 相加
  2. 10进制 转换成 2,8,16进制时,直接除以 相应的进制,直到商小于该进制数,然后将 余数 倒序 组合即可。
  3. 2 进制 转换 成 8进制,把2进制从低位往高位,3位 3位进行间隔,高位不足补0, 然后每3们对应 8进制中的一个数字,组合即可。
  4. 2进制 转换 成 16 进制,把2进制从低位往高位,4位4位进行间隔,高位不中补0,然后每4位对应 16进制中的一个数字,组合即可。
  5. 8进制,16进制 转成 2进制,分别将每位 数字除以 2 直到商为1,然后倒序取余,(注意:8进制中 1个数字对应2进制3个数字,16进制对应4位,高位不足时,补0),然后再组合即可。

三:关于二进制的运算:与运算(&) 、或运算 (|)、按位取反运算(~)

与运算: 可以看作二进制的 乘法运算
    1 & 0 = 0
    1 & 1 = 1
    0 & 0 = 0
    0 & 1 = 0
或运算: 0 或 1 中 只要有1 结果就是1
    0 | 0 = 0
    0 | 1 = 1
    1 | 0 = 1
    1 | 1 = 1
ps:    
  12 | 18  = 30
  12 | 18 | 11 = 31
  30 | 11 = 31
按位取反运算(~): 0 变成 1,1变成0
     ~ 0  = 1
     ~ 1  = 0

   PS:  注意 按位取反(~) 与 逻辑取反 (!) 是有区别的:

        3.1 按位取反 是指将数字转换成二进制后,然后分别对每位数字进行 0 转换 成1 ,1转换成 0.

        3.2 逻辑取反 是指任意数字中,直接将 数字部分是0的部分转换成1,非0部分转换成 0

              

int a = ~503;
int b = !503;  // java 不支持数字这么操作,只支持 boolean 类型

// 结果 a 输出是:  504  ,b 输出是: 010
     503
   2| 201   ......1
   2| 100   ......1
   2| 50    ......0
   2| 25    ......0
   2| 12    ......1
   2| 6     ......0
   2| 3     ......0
   2| 1     ......1
   2| 0     ......1
2进制为:  00000001 10010011
按位取反:  11111110 01101100
转10进制: -504
发布了54 篇原创文章 · 获赞 31 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/u012149894/article/details/86496780
今日推荐