Java:思考Java第4版。为什么在这里使用十六进制?

时间:2014-07-12 18:35:32

标签: java binary hex bit-shift parseint

“从最高位置具有二进制1的数字开始(提示:使用十六进制常量)。使用带符号的右移运算符,每次都将其一直移动到所有二进制位置使用Integer.toBinaryString()显示结果。“

“提示:使用十六进制常量”,为什么会这样?是不可能的,只是简单地声明这样的常量:int i = Integer.parseInt("10101010", 2);

1 个答案:

答案 0 :(得分:1)

好吧,你没有 使用十六进制常量,正如你所想的那样。它很好,因为它很短,你不需要调用任何方法来使用它。此外,您还可以获得一些编译时检查,以确保您所拥有的实际上 int

因此,在您的情况下,您需要一个具有二进制数字的数字处于最重要的位置。对于int,这是二进制文件:

1000 0000 0000 0000 0000 0000 0000 0000

因此,让我们探索一些在代码中编写代码的方法。你可以做你的建议:

int i = Integer.parseInt("10000000000000000000000000000000", 2);

但是这有一些问题:

  1. 不太可读
  2. 您没有进行编译时检查,以确保真正所拥有的内容是int
  3. 所以,如果你偶然这样做了:

    int i = Integer.parseInt("100000000000000000000000000000000", 2); // See the mistake?
    

    你在运行时得到这个:

    Exception in thread "main" java.lang.NumberFormatException: For input string: "100000000000000000000000000000000"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:583)
    at Test.main(Test.java:3)
    

    那并不好玩。意外地提供超出范围的数字(例如,偶然添加另一个0)会导致运行时异常。没有让调试太有趣,是吗......


    编译时常数更为可取。如果您使用Java 7或更高版本,则可以执行以下操作:

    int i = 0b1000_0000_0000_0000_0000_0000_0000_0000;
    

    虽然仍然很尴尬,但它的显着更具可读性,如果你添加一个零太多,你至少会遇到编译时错误。

    Hex更好:

    int i = 0x8000_0000;
    

    因此,虽然 ,但 。你可以期望任何阅读你代码的程序员都能理解十六进制,而且它简短,易读,而且编译器会遇到一些错误。


    所以要结束:是的,可能使用您建议的语法,但我不会说它更容易。 Hex很短,更易读,而且您在代码中遗漏的可能性较小。如果你想真的明确,我仍然建议使用parseInt()方法的二进制文字,因为它更安全。


    (顺便说一下,你问题中的例子并不是你所要求的,但我假设这是一个语法的例子,而不是你实际拥有的那个)