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


int i = 16777215;
void draw(int color) {

}

假设 void draw 期望颜色以 0x 前缀开头,如下所示

draw(0x16777215)

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

draw(0x + i)
Invalid hex literal number

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

谢谢

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

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

关于原始数据类型的 Oracle 教程有更多的信息(和比我:)更多的权威)。

为了证明它在引擎盖下都是一样的,你可以看看一些反汇编的代码。考虑这个类:

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

编译Hexes.java后运行javap -c Hexes将显示后台发生的情况:

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

只需传递i. 没有期望以0x开头的数字的方法这样的东西。 如果它需要一个int,那么它将取任何int,指定为十六进制文字,无论是否带有0x

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

我想你需要这个:

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

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

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

最新更新