【问题标题】:Dynamically add 0x prefix to int in Java在 Java 中为 int 动态添加 0x 前缀
【发布时间】:2014-01-25 21:17:44
【问题描述】:
int i = 16777215;

void draw(int color) {


}

假设 void draw 期望颜色以 0x 前缀开头,就像这样

draw(0x16777215)

如果我尝试这样做会引发语法错误

draw(0x + i)

Invalid hex literal number

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

谢谢

【问题讨论】:

  • 我想你误解了0x的目的。它用于整数文字。
  • 16777215(十进制)和 0x16777215(十六进制)是完全不同的值。你需要弄清楚你想要哪一个。

标签: java hex literals


【解决方案1】:

只需传递i。不存在期望以0x 开头的数字的方法。如果它采用int,那么它将采用任何int,用0x 指定为十六进制文字。

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

【讨论】:

    【解决方案2】:

    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;
    }
    

    在编译 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
    

    【讨论】:

    • 我真的不明白反汇编一些代码如何增加你的答案。这个问题实际上是关于 Java 语法和语义的。如果您需要支持证据,请编写一个产生一些输出的程序......或引用一个有信誉的来源,如 Oracle Java 教程或 JLS 的相关部分。
    • 反汇编的目的是表明,就编译后的程序而言,两个值都只是int 376926741。但我也会添加引用——很好的建议。
    【解决方案3】:

    我猜你需要这个:

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

    【讨论】:

    • 我有像 String hex="803BB9FF"; 这样的字符串我想把它转换成 int color=0x803BB9FF 请帮忙
    • 长颜色 = Long.valueOf(hex,16); //十六进制你的字符串
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      相关资源
      最近更新 更多