在Java中,我可以用二进制格式定义一个整数常量吗?

类似于你如何定义一个hex或八进制的整数常量,我可以用二进制吗?

我承认这是一个非常简单和愚蠢的问题。 我的谷歌search是空的。

所以,随着Java SE 7的发布,二进制表示法是标准的。 如果你对二进制有一个很好的理解,语法是非常简单明了的。

byte fourTimesThree = 0b1100; byte data = 0b0000110011; short number = 0b111111111111111; int overflow = 0b10101010101010101010101010101011; long bow = 0b101010101010101010101010101010111L; 

特别是在将类级别variables声明为二进制文件的时候,使用二进制符号初始化一个静态variables绝对没有问题:

 public static final int thingy = 0b0101; 

只是要小心,不要用太多的数据溢出数字,否则你会得到一个编译器错误:

 byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte 

现在,如果你真的想要看起来,你可以把Java 7中另外一个整洁的新特性(如数字文字)与下划线结合起来。 看看这些二进制符号的奇特例子,带有文字下划线:

 int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011; long bow = 0b1__01010101__01010101__01010101__01010111L; 

现在不是那么好干净,更不要提高可读性了?

我从TheServerSide上的一篇关于这个主题的文章中提取了这些代码片断。 随时查看更多的细节:

Java 7和二进制表示法:掌握OCP Java程序员(OCPJP)考试

在Java 7中:

 int i = 0b10101010; 

旧版本的Java中没有二进制文字(请参阅替代方法的其他答案)。

在Java中没有二进制文字,但我想你可以做到这一点(虽然我不明白这一点):

 int a = Integer.parseInt("10101010", 2); 

Ed Swangren的回答

 public final static long mask12 = Long.parseLong("00000000000000000000100000000000", 2); 

工作正常。 我用long而不是int并添加修饰符来澄清可能的用法作为位掩码。 但是,这种方法有两个不便之处。

  1. 所有这些零的直接打字是容易出错的
  2. 开发时结果不是十进制或hex格式

我可以build议替代方法

 public final static long mask12 = 1L << 12; 

这个expression式显而易见,第12位是1(计数从0开始,从右到左); 当你hover鼠标光标,工具提示

 long YourClassName.mask12 = 4096 [0x1000] 

出现在Eclipse中。 你可以定义更复杂的常量,如:

 public final static long maskForSomething = mask12 | mask3 | mask0; 

或明确地

 public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0); 

在开发时,variablesmaskForSomething的值在Eclipse中仍然可用。

使用二进制常量来掩蔽

声明常量:

 public static final int FLAG_A = 1 << 0; public static final int FLAG_B = 1 << 1; public static final int FLAG_C = 1 << 2; public static final int FLAG_D = 1 << 3; 

并使用它们

 if( (value & ( FLAG_B | FLAG_D )) != 0){ // value has set FLAG_B and FLAG_D } 

在Google上search“Java literals syntax”,然后提出一些条目。

有一个八进制语法(前缀数字为0),十进制语法和hex语法,前缀为“0x”。 但没有二进制表示法的语法。

一些例子:

 int i = 0xcafe ; // hexadecimal case int j = 045 ; // octal case int l = 42 ; // decimal case 

如果你想篡改大量的二进制文件,你可以定义一些常量:

 public static final int BIT_0 = 0x00000001; public static final int BIT_1 = 0x00000002; 

等等

要么

 public static final int B_00000001 = 0x00000001; public static final int B_00000010 = 0x00000002; public static final int B_00000100 = 0x00000004; 

稍微尴尬的回答:

 public class Main { public static void main(String[] args) { byte b = Byte.parseByte("10", 2); Byte bb = new Byte(b); System.out.println("bb should be 2, value is \"" + bb.intValue() + "\"" ); } } 

哪个输出[java] bb应该是2,值是“2”