二进制和种类


前言

话回我刚刚毕业来到深圳时,作为一个android菜鸟在一个大神波哥的指导下,学到了很多东西。其中,二进制和分类就是我印象最深的。想按自己理解记录一下。

想一下,有这样的需求:一个物体有一个种类属性,它这个属性有很多相互独立可以相加的值,也就是它有很多种情况,而且一个物体可同时具有其中一个或者多个情况。而我们想用一个数字就表示它的所有情况(这就是数学思维,总把东西抽象化)。

来个具体的,用于表示一个人是否有高血压,高血糖,高血脂这种属性。这个属性可以有各种情况的值,一个人可以只是有高血压、高血糖或者高血脂,也可以有“三高”。那我们如何用一个十进制的值来表示一个人的这个属性的各种情呢?

我们可以让十进制数字的二进制表示的每一位代表一种情况,运用二进制的位运算来表示和判断它的各种情况。

思路分析

还是上面举的例子。二进制的每一位代表一种情况,三种情况我们可以用二进制的四位表示就可以。其他更多的情况,可以用更多的位来表示。我们约定结果的格式表示为:二进制,十进制。

高血压: 0001,1 。—表示一个人只有高血压
高血糖: 0010,2 。—表示一个人只有高血糖
高血脂: 0100,4 。—表示一个人只有高血脂

那如何表示其他各种情况呢?

表示一个人有高血压和高血糖:0001 | 0010 = 0011,3
表示一个人有高血压和高血脂:0001 | 0100 = 0101,5
表示一个人有高血糖和高血脂:0010 | 0100 = 0110,6
表示一个人有高血压、高血糖和高血脂: 0001 | 0010 | 0100 = 0111,7

我们就说,这就是各种情况“相加”。

如果要从多种情况中减除一种或者多种情况,又如何操作呢?
比如代表“三高”的7,我们如何从中减除高血压这种情况。

7 & (0001) = 0111 & (0001) = 0111 & 1110 = 0110,6

说明:自身取“非”是为了不影响原来其他的各种情况,只改变自身那种情况的位。减除多种情况,以此类推。这就是情况的“相减”

如果给我们一个十进制:7,我们又如何知道它表示有多少种情况呢?

1、是否有高血压 0001?
7 & 0001 = 0001 即 0111 & 0001 = 0001
2、是否有高血糖?
7 & 0010 = 0010 即 0111 & 0010 = 0010
3、是否有高血脂?
7 & 0100 = 0100 即 0111 & 0100 = 0100

这实际就是,位的与运算是否等于自身。这就是各种情况的判断方法。