神奇的二进制

坚持. 分享. 成长. 利他 !

一. 前言

太极生两仪,两仪生四相,四相生八卦,八卦定吉凶

中国的八卦与西方的二进制其实原理上有极其相似的一面. 但是演化和推算方面, 八卦更胜一筹.

阴: 0, 阳: 1;

老阴: 00, 少阳: 10, 少阴: 01, 老阳: 11;

坤: 000, 艮: 100, 坎: 010,巽 :110, ,震: 001, 离:101, 兑: 011, 乾: 111;

image.png

二.正文.

计算机就是一个二进制的逻辑机器

计算机三大件:主板,CPU,内存; 而最主要的就是cpu, cpu的主要组成就是可以理解为晶体管, 晶体管也就相当于是个开关, 即打电报中的._. 这种二进制的简单也造就了计算机快的特性.

**计算机只会二进制, 那怎样才能让计算机有用呢? **

那就是约定大于配置

先是字符集

  • ASCII字符集
  • ISO 8859-1字符集
  • GB2312字符集
  • GBK字符集
  • utf8字符集

数字, 以int为例子:

十进制 二进制
201314 0000 0000 0000 0011 0001 0010 0110 0010
-201314 1000 0000 0000 0011 0001 0010 0110 0010

二进制在源码的巧妙使用(我们以java示例)

很多源码中使用了二进制来区分各个状态, 而且状态可以组合的形式.
主要使用的是&|的计算来实现的.

0&0 = 0;           0|0 = 0;
0&1 = 0;           0|1 = 1;   
1&0 = 0;           1|0 = 1;   
1&1 = 1;           1|1 = 1;
复制代码

例如:

Streams
public int characteristics() {
    // 既包含所有的特性
    return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED |
           Spliterator.IMMUTABLE | Spliterator.NONNULL |
           Spliterator.DISTINCT | Spliterator.SORTED;
}

public int characteristics() {
    if (beforeSplit) {
        // 两个共同都有的特性: aSpliterator.characteristics() & bSpliterator.characteristics()
        return aSpliterator.characteristics() & bSpliterator.characteristics()
               & ~(Spliterator.DISTINCT | Spliterator.SORTED
                   | (unsized ? Spliterator.SIZED | Spliterator.SUBSIZED : 0));
    }
    else {
        return bSpliterator.characteristics();
    }
}
复制代码
public interface Spliterator<T> {
    public static final int ORDERED    = 0x00000010;

    public static final int DISTINCT   = 0x00000001;

    public static final int SORTED     = 0x00000004;

    public static final int SIZED      = 0x00000040;

    public static final int NONNULL    = 0x00000100;

    public static final int IMMUTABLE  = 0x00000400;

    public static final int CONCURRENT = 0x00001000;

    public static final int SUBSIZED = 0x00004000;
}
复制代码

二进制在一些记录中的头信息巧妙使用

mysql中 COMPACT行格式 中一条记录.
image.png

JVM中一个对象的二进制的巧妙使用
image.png

二进制解决一些有趣的问题

有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周后找出那桶毒酒,问最少需要多少老鼠。

这个问题其实大家都见到过. 解题思路也巧妙地使用了二进制来完成.

  • 把10只老鼠依次排队为:0 – 9,关在笼子里

  • 把1000瓶药依次编号,并换算成二进制,如 8 = 1000,根据二进制中出现1的位数对相应位置小鼠喝药。 因为我们选择的是10只

    小鼠,2^10 = 1024 > 1000,能够保证所有的编号的酒都能被喂小鼠而不会遗漏被转为二进制的1的位.

  • 长时间的等待,等待小鼠的死亡

  • 把死亡小鼠的依次记录,然后10位的二进制中, 死亡老鼠编号对应10位中的二进制数为1, 没死的老鼠编号对应10为中的二进制数为0, 即知毒药的编号.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享