在Java中动态地将0x前缀添加到int

时间:2014-01-07 23:48:36

标签: java hex literals

int i = 16777215;

void draw(int color) {


}

让我们说void draw期望颜色以0x前缀开头,如此

draw(0x16777215)

如果我尝试这样做会抛出语法错误

draw(0x + i)

Invalid hex literal number

int我不能包含0x部分,需要动态添加

感谢

4 个答案:

答案 0 :(得分:10)

0x1234只是编写整数值的另一种方式。例如,0xff255完全相同。 draw(0x16777215)draw(376926741)是相同的电话。在字节码级别,没有任何差异。唯一的区别在于人类阅读代码的方式;有时用字节来思考更容易,这很容易用十六进制表示。

如果数字以0x开头,则表示其余数字被解释为十六进制。而不是0x16777215,我猜你想要16777215(没有0x),这也是0xFFFFFF

Oracle tutorial on primitive datatypes有更多的信息(比我更多的权威:))。

为了证明它在引擎盖下是完全相同的,你可以看一些反汇编的代码。考虑这个课程:

public class Hexes {
  public static int alpha = 0x16777215;
  public static int beta = 376926741;
}

编译javap -c Hexes后运行Hexes.java会告诉您幕后发生了什么:

Compiled from "Hexes.java"
public class Hexes {
  public static int alpha;

  public static int beta;

  public Hexes();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  static {};
    Code:
       0: ldc           #2                  // int 376926741
       2: putstatic     #3                  // Field alpha:I
       5: ldc           #2                  // int 376926741
       7: putstatic     #4                  // Field beta:I
      10: return
}

标记为static {}的块是类'静态初始值设定项,其中设置了alphabeta。请注意,两个字段(alpha和beta)都分配了相同的int值。如果您要编写一个简短的程序来打印出值,您会看到每个值的相同值:

public class HexesPrinter {
    public static void main(String[] args) {
        System.out.println(Hexes.alpha);
        System.out.println(Hexes.beta);
    }
}

输出:

376926741
376926741

答案 1 :(得分:2)

刚刚通过i。没有一种方法需要一个以0x开头的数字。如果它需要int,那么它将采用任何int,指定为带有0x的十六进制文字。

另外,要小心。 0x1677721516777215不同。

答案 2 :(得分:1)

我想你需要这个:

Integer.valueOf(String.valueOf(i), 16)

答案 3 :(得分:0)

首先需要了解在Java中指定基数10和基数16(十六进制)之间的区别。正如其他人所说,0x是一个数字的前缀,表示它在16(十六进制)中。

以十六进制表示法指定颜色非常有用,因为它们具有组件(Alpha,R,G,B),当您将它们放在基础10中时,这些组件并不明显。有关详细信息,请参阅此答案:https://stackoverflow.com/a/8633244/1168342 < / p>