十六进制常量还有这种玩法

作者: 键盘上的麒麟臂 | 来源:发表于2019-10-16 22:52 被阅读0次

今天敲代码敲到一半,突然想到一种用16进制来定义常量的使用方法。我相信这种方法肯定也会有很多人早就知道并且已经有分享,我也是才刚刚发现,如果有什么地方写得不好或者不够完整的话,希望大家能指出。

一般的写法

可能有些朋友平时在开发时定义常量状态是这样定义的:

public static final int SEX_BOY = 0; // 男生
public static final int SEX_GIRL = 1; // 女生

然后看了某篇文章之后,某个经验丰富的说,定义常量时最好使用16进制,再去看了看Android某些类的源码,嗯,好像里面定义常量确实是使用了16进制,于是之后写代码就开始

public static final int SEX_BOY = 0x00; // 男生
public static final int SEX_GIRL = 0x01; // 女生
public static final int SEX_OTHER = 0x02; // 其它

比如说有很多个状态,就从0x01、0x02......0xff 这样列举下去。

现在的写法

然后今天get到了一个技能,先说说怎么定义,再讲为什么这么写,现在这样来定义

public static final int TYPE1 = 0x01;
public static final int TYPE2 = 0x02;
public static final int TYPE3 = 0x04;
public static final int TYPE4 = 0x08;
public static final int TYPE5 = 0x10;
public static final int TYPE6 = 0x20;
public static final int TYPE7 = 0x40;
public static final int TYPE8 = 0x80;

为什么这么写呢?
我们将16进制转成2进行,上面就对应成

十六进制 二进制
0x01 0000 0001
0x02 0000 0010
0x04 0000 0100
0x08 0000 1000
0x10 0001 0000
0x20 0010 0000
0x40 0100 0000
0x80 1000 0000

有意思的就在这里,我先说的我想的过程中错误的一个思路(我觉得挺有意思的,所以可以说下,因为是一个错误的思路,如果不想看可以直接跳看下面的这样定义的原因)
二进制从右往左来说
(1)我用第一位表示性别 000:女 001:男
(2)我用第二位表示角色 000:学生 010:老师
(3)我用第三位表示班级 000:A班 100:B班
那么 “A班的女老师” 我可以表示成 010 = 2
“A班的男老师” 可以表示成 011=3
“B班的女学生”可以表示成 100 .....
这样可以组成8个状态而不会冲突,但是这样的做法是只能用3个状态组合进行比较,而且单个状态下有000表示了3种,而且这种做法同一位上只能表示两种状态,假如我加个C班,那就没辙了。

然后换了一种思考的方法,假如我这样表示状态

public static final int TYPE1 = 0x01;  // 女
public static final int TYPE2 = 0x02;  // 男
public static final int TYPE3 = 0x04;  // 学生
public static final int TYPE4 = 0x08;  // 老师
public static final int TYPE5 = 0x10;  // 主任
public static final int TYPE6 = 0x20;  // A班
public static final int TYPE7 = 0x40;  // B班
public static final int TYPE8 = 0x80;  // C班

那么 使用二进制的或运算:
“A班的女老师” 我可以表示成 TYPE6|TYPE1|TYPE4 = 0010 1001 = 41
“A班的男老师” 可以表示成 TYPE6|TYPE2|TYPE4 = 0010 1010 = 42
“B班的女主任”可以表示成 TYPE7|TYPE1|TYPE5 = 0101 0001 = 81
这样也能把多个状态组成一个状态,而且组合状态也能和单个状态进行同等级判断,并且这种做法不会产生重复的状态。

举个例子就是说你平时写

if(性别==女 && 角色 == 老师 && 班级 == A班){
    ......
}else if(版本 == C班){
    ......
}

如果用我这种方法定义状态的话,你只用写

if(type == 0x29){
    ......
}else if(type == 0x80){
    ......
}

可能有些人说就紧紧为了这样?那我写&&还好过,写成16进制转换转的我脑壳疼。我还不如多写几个&&,而且这样也更容易让别人看懂。
但这个写法不仅仅有这种好处,再举个例子,假如在很多个组合的状态中你需要去判断这个状态是“男”还是“女”等等,多状态下判断单状态多了,也不是说乱,但会写很多代码,但是现在可以直接这样写

public void switchSex(type){
    if(type & 0x03 == 0x01){
        // 是女生
    }else{
        // 是男生
    }
}

就可以直接这样用二进制的与运算来实现判断。

我也仅仅是举了两个例子,我的意思是这样去定义十六进制常量,方便二进制做运算,二进制还有其他的运算呢,我仅仅举了“或”和“与”,还有什么异或啊,移位啊之类的,而且就算作用不大,按装逼来说,我直接做二进制的运算肯定比你那些乱七八糟的运算来得快吧。

总结

当然这只是我领悟的一种思路,而且我想很多人也知道这种做法,或者用16进制来定义常量不仅仅有这个好处,只是我觉得很有意思,所以写了出来。

相关文章

  • 十六进制常量还有这种玩法

    今天敲代码敲到一半,突然想到一种用16进制来定义常量的使用方法。我相信这种方法肯定也会有很多人早就知道并且已经有分...

  • -8- scala常量

    [参考link] 整数常量 整数常量可以用十进制,十六进制或八进制表示

  • 常量

    常量 常量分类整型常量:也就是常整数二进制十进制八进制十六进制实型常量floatdouble默认情况下编写的小数都...

  • Java谜题5 - 十六进制的趣事

    下面的程序是对两个十六进制(hex)字面常量进行相加,然后打印出十六进制的结果。这个程序会打印出什么呢? 看起来很...

  • Java和C++常量

    Java中的常量 整型常量 表示形式为十进制,八进制(以0为前缀),十六进制(以0x为前缀)。默认整数为int型,...

  • c语言程序设计五:整型数据

    整型数据 整型常量的表示方法: 整型常量就是整常数。 在C语言中,使用的整常数有八进制、十进制、十六进制三种。(1...

  • 整型常量不同进制间的相互转换

    整型常量可以分别用二进制、八进制、十进制和十六进制表示,不同的进制并不影响数据本身的大小,同一个整型常量可以在不同...

  • java__常量池

    java的常量池分为两种型态:静态常量池和运行常量池 静态常量池: 即class文件中的常量池,这种常量池主要用于...

  • Java常量和C#常量

    常量是固定值,程序执行期间不会改变。常量可以是整数常量、浮点常量、字符常量或者字符串常量,还有枚举常量。 1. 定...

  • 改善Java程序建议2

    建议2:莫让常量蜕变成变量 RAND_CONST 这种常量的定义方式是极不可取的,常量就是常量,在编译期就必须确定...

网友评论

    本文标题:十六进制常量还有这种玩法

    本文链接:https://www.haomeiwen.com/subject/xcdpmctx.html