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

时间:2011-06-30 10:46:18

标签: java hex

最近我遇到了像这样的一行

  

public final static int DELETION_MASK = 0x01;

为什么不喜欢

  

public final static int DELETION_MASK = 1;

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

4 个答案:

答案 0 :(得分:21)

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

#define MASK 0x0000ffff

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

作为奖励,十六进制表示法也可以避免带有负数的问题:0xffffffff实际上是负数(确切地说-1)。你可以用十六进制来指定掩码,而不是用符号和二进制补码编号,而不是用它来完成。


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

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

public final static int DELETION_MASK = 0b0000_0001;

答案 1 :(得分:10)

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

因为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

答案 2 :(得分:2)

只有这样,当你定义NONDELETION_MASK = 0x0A时它才会一致。

答案 3 :(得分:0)

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