java中的16进制用法

public static final int NETWORK_NONE = 0x01;
public static final int NETWORK_MOBILE = 0x02;
这样类似的代码见过不少,但是只晓得是16进制,但是为什么要写成16进制,以及有什么好处却没有仔细研究过。

在java中,声明一个10进制数字很简单,直接写数字就行,比如 98. 代表的十进制数据就是98.很易懂。
声明一个8进制。则在数字的前面加上一个0, 即可,例如 077。 但是每一位的数字范围是 0-7. 代表的10进制数字是,115.
声明一个16进制,在数字的前面加上一个0x即可。例如 0xff。 每一位的数字范围是 0-f。 代表的10进制数字是 377.
那么为什么大家喜欢用16进制呢?暂且把他们转换成2进制来看看。
如下:
16进制 = 8进制 = 二进制 = 10进制
0x00 = 00 = 00000000 = -0
0x01 = 01 = 00000001 = 1
0x02 = 02 = 00000010 = 2
0x03 = 03 = 00000011 = 3
0x04 = 04 = 00000100 = 4
0x05 = 05 = 00000101 = 5
0x06 = 06 = 00000110 = 6
0x07 = 07 = 00000111 = 7
0x08 = 010 = 00001000 = 8
0x09 = 011 = 00001001 = 9
0x0a = 012 = 00001010 = 10
0x0b = 013 = 00001011 = 11
0x0c = 014 = 00001100 = 12
0x0d = 015 = 00001101 = 13
0x0e = 016 = 00001110 = 14
0x0f = 017 = 00001111 = 15
0x10 = 020 = 00010000 = 16

0x00 = 00 = 00000000 = 0
0x02 = 02 = 00000010 = 2
0x04 = 04 = 00000100 = 4
0x08 = 010 = 00001000 = 8
0x10 = 020 = 00010000 = 16
0x100 = 0400 = 100000000 = 256
0x1000 = 010000 = 1000000000000 = 4096

接下来专门看看16进制与二进制
0x00 = 0 = 0
0x10 = 10000 = 16
0x100 = 100000000 = 256
0x1000 =1000000000000 = 4096 16进制中,1向左移动一位相当于二进制左移4位。

下面是专门的8进制与二进制
00 = 0
010 = 1000
0100 = 1000000
01000 = 1000000000
010000 = 1000000000000 8进制中,1向左移动一位相当于二进制左移3位。

那么我们如果有些情况下要写一些代码,表示不同类型不同状态。可以用16进制记录
如:
描述材质。假设有,
木质, 包含 竹木,红木,檀木,桃木
金属, 包括铜,铝,铁,金,银。
气体, 包括 氧气,氮气,氦气。
那么如何描述,能达到一种,给你一个对应的详细type,你就可以快速的知道他是属于什么种类的呢???
利用16进制,外加位运算就可以满足这种情况
竹木 = 0x10;
红木 = 0x11;
檀木 = 0x12;
桃木 = 0x13;

铜 = 0x100;
铝 = 0x110
铁 = 0x120
金 = 0x130
银 = 0x140

氧气 = 0x1000
氮气 = 0x1100
氦气 = 0x1200

然后随便给你个具体的type,让你区分出是什么类:
你可以这样做:
木质的mask = 0x10
金属的mask = 0x100
气体的mask = 0x1000
然后对指定的type做出按位与操作。可以很快的得出是不是该类:
例如
氮气的 type & 气体的mask
即 0x1100 & 1x1000 两者转换为二进制,实则是 1000100000000 & 1000000000000 看出来了吗,,由于type的最高位和mask的最高位是一样的,一旦按位与(两者都是1,结果才是1), 结果就是true。这样的按位与操作,可以很快的比较出特定的位是否为1.我们可以利用这个特性,让某一类的某一位都是一个数,就可以做到很快的侦测类别。

例如
具有文具属性的mask 为 0x10; 16进制第二位为1
具有纸质属性的mask为 0x100; 16进制第三位为1
具有办公用品特点的mask为0x1000; 16进制第四位为1
那么,一个打印纸,和一个试卷他们具有的特性可以描述为
打印纸: 0x1100 (第四位为1 代表是办公用品, 第三位为1 代表是纸类),那么它既是纸又是办公用品
试卷: 0x110

然后判别打印纸是不是具有纸质的特性只需要做一个事, 打印纸 & 纸质特性对应的mask 结果是否是true。
即 0x1100 & 0x100

如果有类似于区分类别的要求时,不妨用下16进制表示。但是原则上,8进制实则也可以做同样的事情,只不过八进制是向左移动一位相当于 其二进制数向左移动3位。为什么大家喜欢用16进制呢??我能想到的原因是,,16进制 每一位是 0-f的范围,表示的子类别比较多。。。。

关于 二进制的左移右移, 如果代表的十进制是偶数, 右移n位代表除以2的n次方, 左移n位则代表乘上2的n次方。

事实上16进制还有许多其他的用法。因为本人渣渣水平,没有太多的用过16进制。暂时就写这么些吧。

猜你喜欢

转载自blog.csdn.net/weixin_28774815/article/details/83450137