使用0x01而不是1作为整数变量的优点?

最近我遇到了这样一条线

public final static int DELETION_MASK = 0x01;

为什么不喜欢

public final static int DELETION_MASK = 1;

使用除0xA以外的第一种方法是否有任何优势,上限hex可以轻松转换? 在这种情况下,它只是一个代表1的常量。

虽然编译器生成的代码没有区别,但传统上使用hex表示法编写位掩码,因为人类转换为二进制forms要容易得多。 另一个常见的惯例是当已知场的长度时包括前导零。 例如,对于C int字段,通常会写:

 #define MASK 0x0000ffff 

另外,hex常量向程序员表明它可能是一个掩码,或者某种程度上涉及按位运算的值,应该特别对待。

作为奖励,hex符号也可以避免带负数的问题: 0xffffffff实际上是负数(确切地说是-1 )。 您可以只使用hex指定掩码,而不是使用符号和二进制补码编号。


从Java 7开始,您还可以使用二进制文字 ,这使人们更容易理解在位掩码中设置哪些位。 二进制文字可以使用下划线将这些位放入单独的组中。

这意味着以下内容也是有效的:

 public final static int DELETION_MASK = 0b0000_0001; 

它有助于整数值和它所代表的位模式之间的心理转换,这对于标志和掩码很重要。

因为16是2的幂(不像10),你会得到很好的重复:

 public final static int A_FLAG = 0x01; // 00000001 public final static int B_FLAG = 0x02; // 00000010 public final static int C_FLAG = 0x04; // 00000100 public final static int D_FLAG = 0x08; // 00001000 public final static int E_FLAG = 0x10; // 00010000 public final static int F_FLAG = 0x20; // 00100000 public final static int G_FLAG = 0x40; // 01000000 public final static int H_FLAG = 0x80; // 10000000 

只有这样,当你定义NONDELETION_MASK = 0x0A时它将是一致的。

这很容易理解。 每当我们考虑屏蔽时,我们总是以HEX或BIN数字来思考。