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

Aar*_* Fi 84 java syntax binary

类似于如何定义十六进制或八进制的整数常量,我可以用二进制来完成吗?

我承认这是一个非常简单(和愚蠢)的问题.我的谷歌搜索空洞.

Rus*_*ard 152

在Java 7中:

int i = 0b10101010;
Run Code Online (Sandbox Code Playgroud)

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

  • 我还想指出可以有`_`字符使序列更具可读性:`int i = 0b1010_1010_0011;` (33认同)

Cam*_*zie 65

因此,随着Java SE 7的发布,二进制表示法开箱即用.如果你对二进制有一个很好的理解,那么语法非常简单明了.

byte fourTimesThree = 0b1100;
byte data = 0b0000110011;
short number = 0b111111111111111; 
int overflow = 0b10101010101010101010101010101011;
long bow = 0b101010101010101010101010101010111L;
Run Code Online (Sandbox Code Playgroud)

特别是在将类级变量声明为二进制文件时,使用二进制表示法初始化静态变量绝对没有问题:

public static final int thingy = 0b0101;
Run Code Online (Sandbox Code Playgroud)

请注意不要使用太多数据溢出数字,否则您将收到编译器错误:

byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte
Run Code Online (Sandbox Code Playgroud)

现在,如果您真的想要获得幻想,可以将Java 7中另一个简洁的新功能(称为数字文字与下划线)结合起来.用文字下划线看看这些二进制表示法的奇特例子:

int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011;
long bow = 0b1__01010101__01010101__01010101__01010111L;
Run Code Online (Sandbox Code Playgroud)

现在不是那么干净,更不用说高度可读了吗?

我从TheServerSide上关于该主题的一篇文章中提取了这些代码片段.请随时查看更多详细信息:

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

  • 为什么你的字节数据= 0b0000110011; 有10位?我是编程的新手,但我认为它应该看起来像0b00110011,以适应8位字节数据类型. (3认同)

Ed *_* S. 53

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

int a = Integer.parseInt("10101010", 2);
Run Code Online (Sandbox Code Playgroud)

  • 自Java 7以来,Russ Hayward的回答是正确的答案.在Java 7之前,您可以使用在线工具或您喜欢的计算器将二进制文件转换为旧Java版本(八进制,十进制或十六进制)识别的符号之一.如果使用另一个基数,则可以在声明中放置包含二进制表示的描述性注释,以阐明读者的价值. (5认同)

chg*_*man 18

Ed Swangren的回答

public final static long mask12 = 
  Long.parseLong("00000000000000000000100000000000", 2);
Run Code Online (Sandbox Code Playgroud)

工作良好.我使用long而不是int添加修饰符来澄清可能的用法作为位掩码.但是,这种方法存在两个不便之处.

  1. 直接键入所有这些零是容易出错的
  2. 在开发时,结果不能以十进制或十六进制格式提供

我可以建议替代方法

public final static long mask12 = 1L << 12;
Run Code Online (Sandbox Code Playgroud)

这个表达式很明显第12位是1(计数从0开始,从右到左); 当你悬停鼠标光标时,工具提示

long YourClassName.mask12 = 4096 [0x1000]
Run Code Online (Sandbox Code Playgroud)

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

public final static long maskForSomething = mask12 | mask3 | mask0;
Run Code Online (Sandbox Code Playgroud)

或明确地

public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0);
Run Code Online (Sandbox Code Playgroud)

maskForSomething在开发时,Eclipse中仍然可以使用该变量的值.


paw*_*eba 16

使用二进制常量来屏蔽

声明常量:

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;
Run Code Online (Sandbox Code Playgroud)

并使用它们

if( (value & ( FLAG_B | FLAG_D )) != 0){
    // value has set FLAG_B and FLAG_D
}
Run Code Online (Sandbox Code Playgroud)


Pie*_*rre 12

在Google上搜索"Java literals syntax",你会得到一些条目.

有一个八进制语法(数字前缀为0),十进制语法和带有"0x"前缀的十六进制语法.但没有二进制表示法的语法.

一些例子:

int i = 0xcafe ; // hexadecimal case
int j = 045 ;    // octal case
int l = 42 ;     // decimal case
Run Code Online (Sandbox Code Playgroud)

  • k怎么了? (2认同)