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

jes*_*er1 8 java hex literals

int i = 16777215;

void draw(int color) {


}
Run Code Online (Sandbox Code Playgroud)

让我们说void draw期望颜色以0x前缀开头,就像这样

draw(0x16777215)
Run Code Online (Sandbox Code Playgroud)

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

draw(0x + i)

Invalid hex literal number
Run Code Online (Sandbox Code Playgroud)

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

谢谢

ysh*_*vit 11

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

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

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

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

public class Hexes {
  public static int alpha = 0x16777215;
  public static int beta = 376926741;
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

输出:

376926741
376926741
Run Code Online (Sandbox Code Playgroud)


rge*_*man 2

就过去吧i。不存在需要以 开头的数字的方法0x。如果它接受 an int,那么它将接受 any int,指定为十六进制文字,带0x或不带。

另外,要小心。 0x16777215是一个与 不同的数字16777215