【问题标题】:Bitwise Operators java位运算符 java
【发布时间】:2011-12-11 14:45:06
【问题描述】:

我的代码是

final int CONST_1 = 1010;
final int CONST_2 = 1011;

System.out.println("CONST_1 & CONST_2: " + Integer.toBinaryString(CONST_1 & CONST_2));
System.out.println("CONST_1 ^ CONST_2: " + Integer.toBinaryString(CONST_1 ^ CONST_2));
System.out.println("CONST_1 | CONST_2: " + Integer.toBinaryString(CONST_1 | CONST_2));
System.out.println("~CONST_1 : " + Integer.toBinaryString(~CONST_1));

输出是

CONST_1 & CONST_2: 1111110010
CONST_1 ^ CONST_2: 1
CONST_1 | CONST_2: 1111110011
~CONST_1 : 11111111111111111111110000001101

在我看来这是错误的,应该是:

CONST_1 & CONST_2: 1010
CONST_1 ^ CONST_2: 1
CONST_1 | CONST_2: 1011
~CONST_1 : 101

请解释我为什么会有这样的结果。谢谢!

【问题讨论】:

  • 您初始化常量的值是十进制,而不是二进制!

标签: java bit-manipulation


【解决方案1】:

改变这个:

final int CONST_1 = 1010;
final int CONST_2 = 1011;

到这里:

final int CONST_1 = 0b1010;
final int CONST_2 = 0b1011;

不要忘记默认情况下文字是十进制的。您显然希望它们是二进制的。


二进制文字需要 Java 1.7。因此,如果这不可用,您可以这样做:

final int CONST_1 = Integer.parseInt("1010",2);
final int CONST_2 = Integer.parseInt("1011",2);

【讨论】:

  • 我无法将其更改为 final int CONST_1 = 0b1010;
  • 它说二进制文字只能用于源级别 1.7 或更高版本
  • 查看这个问题:(stackoverflow.com/questions/867365/…) 0b 前缀需要 Java 7。
【解决方案2】:

我想你知道字面量是什么意思。如果没有,请参考:Java LiteralsLiteral

现在,整数和浮点字面量在 Java 中默认为十进制。因此,您在上面键入的值1010 将是十进制的1010。即,一千零。如果您希望它们是二进制的(从问题中可以清楚地看出),有很多可能性。

  • 使用等效的十进制值。

您可以使用要表示的二进制值的十进制等效值。例如,二进制1010 的十进制等效值为10,二进制1011 的十进制等效值为11

final int CONST_1 = 10;
final int CONST_2 = 11;
  • 使用包装类解析方法

每个包装类都有一个 parse 方法,它也以数字系统的基数作为参数。所以

final int CONST_1 = Integer.parseInt("1010", 2);
final int CONST_2 = Integer.parseInt("1011", 2);
  • 如果您使用的是 Java 7,请使用二进制字面量

较早版本的 Java 不支持二进制文字。 Java 7 引入了二进制文字。见features

final int CONST_1 = 0b1010;
final int CONST_2 = 0b1011;

【讨论】:

    【解决方案3】:

    CONST_1 是十进制的1010CONST_1 的二进制值为1111110010。同样CONST_21111110011

    结果现在更有意义了吗?

    【讨论】:

      【解决方案4】:

      不要将仅由 0 和 1 组成的整数与整数的二进制表示混淆...

      整数1010是二进制的1111110010,所以结果是正确的。

      【讨论】:

        【解决方案5】:

        你的数字不是二进制的。它们是用十进制写的。你想在前面加上一个 0b 来告诉 Java 7 这个 int 是二进制的。如果您不使用 Java 7,则没有二进制文字语法,因此您可以使用 Integer.parseInt("1010", 2) 作为解决方法或使用 HEX 文字表示法:

        final int CONST_1_BINARY = 0b1010;
        final int CONST_1_DECIMAL = 1010;
        
        if( CONST_1_BINARY == CONST_1_DECIMAL ) {
           System.out.println("They are the same!");
        } else {
           System.out.println("They are NOT the same.");
        }
        

        【讨论】:

          猜你喜欢
          • 2021-05-14
          • 2012-09-06
          • 2013-07-25
          • 1970-01-01
          • 2016-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多