前端时间在看HashMap源码的时候看到static final int DEFAULT_INITIAL_CAPACITY = 1 << 4这种写法,一时不明白为什么不直接写成static final int DEFAULT_INITIAL_CAPACITY = 16?带着这问题咨询了一技术群的大牛们。下面就先从一大神给我举的一列子讲起:
举例1:
假如你系统有一大堆是是否判定:男女,是否已婚,是否vip,是否毕业?你会如何表达?为每条信息设置一个布尔变量?也许大部分人都会这么选择,但是经过对二进制的了解后我会用4为2进制表达为:
0001:男
0010:已婚
0100:vip
1000:毕业
对应移位运算的依次是:1 << 0; 1<<1; 1 << 2; 1 << 3;也许看到这你会问为什么不直接用1,2,4,8数值直接表示,但是继续加大,二进制位数继续增多,10进制就不那么容易阅读了,比如1000 0000 0000 ,用10进制你能一下反应过来么,但是如果用位运算 1 << 11 你是不是就一目了然呢?
任何一数字 & 0010 > 0就表示已婚,这样是不是很清楚很方便呢,并且这种占用的存储空间是最少的,运算也是最快的
举例2:
大家都知道千奇百怪颜色都是由3原色(红,绿,蓝)组成,每种颜色都可以用一个字节(8位2进制)表示,2个位16进制正好一字节,所以颜色习惯的选用6为2进制表示
比如黑色:000000,白色:ffffff,如果你换成10进制的话是不是很难阅读呢
举例3:
java.lang.reflect.Modifier类
public static final int PUBLIC = 0x00000001;
public static final int PRIVATE = 0x00000002;
public static final int PROTECTED = 0x00000004;
public static final int STATIC = 0x00000008;
public static final int FINAL = 0x00000010;
public static final int SYNCHRONIZED = 0x00000020;
public static final int VOLATILE = 0x00000040;
public static final int TRANSIENT = 0x00000080;
public static final int NATIVE = 0x00000100;
public static final int INTERFACE = 0x00000200;
public static final int ABSTRACT = 0x00000400;
public static final int STRICT = 0x00000800;
static final int BRIDGE = 0x00000040;
static final int VARARGS = 0x00000080;
static final int SYNTHETIC = 0x00001000;
static final int ANNOTATION = 0x00002000;
static final int ENUM = 0x00004000;
static final int MANDATED = 0x00008000;
该类就大量的使用16进制定义类,成员的修饰符,判断某一类或成员是否具有public权限,我们只需要传入修饰符集与PUBLIC静态变量取“与”如果不为0就表示具有public权 限,实现代码如下
public static boolean isPublic(int mod) {
return (mod & PUBLIC) != 0;
}
总结:
- 16进制能够很好的转换成2进制,而且1位16进制正好一个字节,便于阅读
- 1 << n能够一目了然的知道二进制的数值是多少,便于阅读
- 二进制能够被设计成很好的出来关于是否判断的问题
- 二进制具有占用存储空间最小,速度快的有点