【问题标题】:In Java, can I define an integer constant in binary format?在Java中,我可以用二进制格式定义一个整数常量吗?
【发布时间】:2010-10-26 10:12:49
【问题描述】:

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

我承认这是一个非常简单(而且很愚蠢)的问题。我的谷歌搜索结果是空的。

【问题讨论】:

  • 仅供参考,在几乎所有编程语言中,习惯用法是用十六进制编写二进制常量,而不是实际的二进制字符串。
  • 对,但我想那是因为十六进制是最接近可用的东西,而不是因为二进制有问题。在我使用的支持二进制文字的语言中,我认为惯例不会忽略此功能。
  • 2017 年:接受的答案必须是 Russ 提供的答案。见:stackoverflow.com/a/1692932/716079

标签: java syntax binary


【解决方案1】:

因此,随着 Java SE 7 的发布,二进制表示法成为开箱即用的标准。如果你对二进制有很好的理解,语法就非常简单明了:

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

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

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 上写的一篇关于该主题的小文章中提取了这些代码 sn-ps。请随时查看以获取更多详细信息:

Java 7 and Binary Notation: Mastering the OCP Java Programmer (OCPJP) Exam

【讨论】:

  • 为什么你的字节数据=0b0000110011;有 10 位?我是编程新手,但我认为它应该看起来像 0b00110011 以适应 8 位字节数据类型。
  • 对于任何想和 Mike 一样的人来说,这是因为编译器将它转换为它所代表的数字 - 你可以有几十个前导零,它们不会影响实际值。编译过程基本上和你在那里写一个小数一样。
  • 根据定义,原始类型字节可以存储 -128 到 127(-128 到 -1 和 0 到 127)之间的 256 个数字。但是如何使用二进制文字表示 -128。例如字节 b = -0b1111111;表示 -127 但 -128 呢?
【解决方案2】:

使用二进制常量进行屏蔽

声明常量:

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
}

【讨论】:

    【解决方案3】:

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

    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;
    

    【讨论】:

      【解决方案4】:

      在 Java 7 中:

      int i = 0b10101010;
      

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

      【讨论】:

      • 我还想指出可以有 _ 字符以使序列更具可读性:int i = 0b1010_1010_0011;
      • @Russ 0b 在这里意味着什么? Java 7 中的这个特性是什么?
      • 0b 表示二进制。该功能称为二进制文字:docs.oracle.com/javase/7/docs/technotes/guides/language/…
      • 喜欢这种二进制数据的新表示。字符串表示将很难阅读。查看接受的答案与来自“@user12345613”的答案的区别。为他 +1。
      【解决方案5】:

      Ed Swangren 的回答

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

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

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

      我可以建议替代方法

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

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

      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);
      

      变量maskForSomething 的值在开发时仍可在Eclipse 中使用。

      【讨论】:

      • 绝妙的解决方案! (public final static long mask12 = 1L
      【解决方案6】:

      稍微尴尬的回答:

      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”

      【讨论】:

        【解决方案7】:

        在 Google 上搜索“Java 文字语法”,您会找到一些条目。

        有八进制语法(以 0 为数字前缀)、十进制语法和以“0x”为前缀的十六进制语法。但没有二进制表示法的语法。

        一些例子:

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

        【讨论】:

        • 这不能回答问题。
        • 2017 年:幸运的是,存在二进制表示法。它以“0b”开头。示例:byte b = 0b01000001(为了更好地阅读byte b = 0b0100_0001)。
        【解决方案8】:

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

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

        【讨论】:

        • 在其他用途​​中,线和多边形光栅化的点画图案在几个流行的图形库中被指定为整数。使用 parseInt 或 parseShort 允许开发人员轻松地可视化模式。
        • 从 Java 7 开始,Russ Hayward 的答案就是正确的答案。在 Java 7 之前,您可以使用在线工具或您喜欢的计算器将二进制转换为旧 Java 版本(八进制、十进制或十六进制)可识别的符号之一。如果使用另一个基数,可以在声明中放置包含二进制表示的描述性注释,以向读者阐明价值。
        • 这是一个相当肮脏的解决方案,不是吗?您只需要 16 个字节来表示 1 个字节(不计算第二个参数和转换)。当然,除非编译器对此进行优化,我对此表示怀疑。
        • @TomášZato:是的,但是鉴于我写这个答案时该语言不支持二进制文字,你会建议什么解决方案? Russ Hayward 现在应该有公认的答案了。
        • 我建议放弃舒适并使用整数。在变量定义本身中,没关系,但是这个答案可能会激励用户使用这种方法进行循环等。一般来说,我认为程序员应该为了一些性能而放弃自己的舒适。
        猜你喜欢
        • 2016-03-07
        • 2011-07-12
        • 1970-01-01
        • 2014-01-15
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多