【问题标题】:Convert Java String hexadecimal number to int hexadecimal number将 Java String 十六进制数转换为 int 十六进制数
【发布时间】:2016-01-17 20:24:53
【问题描述】:

我需要弄清楚,如何设置十六进制数0xffff,它用于在下面的代码中动态进行位与。

int offsetData = address & 0xffff;

例如我需要这样的东西:

int offsetData = address & myHexaValue;

我有一个十进制 int 值,我需要以十六进制格式而不是 myHexaValue

这是我现在的状态。

int decimalShift = 16*8;    
String myHexaValueString = Integer.toHexString(decimalShift);

现在.. 我可以将我的 String hexa 数字转换为 int hexa 数字,以便我可以将结果放入 myHexaValue 吗?

【问题讨论】:

  • 你就不能写int myHexaValue = 0xffff;吗?
  • 也许我不明白,但它是如何解决我的问题的?我需要动态设置这个六进制值。方法只获取十进制值。

标签: java hex bit-manipulation


【解决方案1】:

您不需要转换它。没有十六进制数这样的东西。以十六进制书写的数字是以 16 进制表示的数字。我们通常使用以 10 为基数的表示法,因此我们有从 0 到 9 的数字,但在十六进制表示法中,您有从 0 到 F 的数字。 所以只需做一个和操作:

int offsetData = address & decimalShift;

编辑: 要仅获取低 16 位,请使用掩码。 0xffff 并执行 & 操作,高 16 位将设置为 0,低 16 位将保持不变。 所以:

int offsetData = address & decimalShift & 0xffff;

编辑2: 要获得任意数量(0,...,31)位的掩码,您可以使用此函数:

private static int getMask(int numOfOnes) {
        int i = 0x80000000;
        i = i>>(32-numOfOnes-1);
        i = ~i;
        return i;
    }

Pauls 解释:“用 >> 进行移位会在移位前用 MSB 的值填充最高有效位,因此在此代码中,除了 numOfOnes 最低位之外的所有位都用 1 填充,然后数字反转。”

【讨论】:

  • 我的目标是获得“一些”(32 位)整数的最后一位。如果是 16 位,解决方案是 int val = x & 0xffff; ...我需要弄清楚,如何获得 n 个数字。
  • 拜托,如果我需要例如 8 和 5 个低位,你能告诉我代码会发生什么变化吗?谢谢你。我还是不知道,这里&decimalShift有什么目的。
  • 关于 EDIT2 的注意事项:使用>> 进行移位会在移位前用 MSB 的值填充最高有效位,因此在此代码中,除numOfOnes 最低位之外的所有位都用 1 和之后数字反转。
  • 我添加了你的 (@Paul) 解释作为答案的一部分,所以它更引人注目。
  • @someone_somewhere 谢谢,希望你这样做,只是不想自己编辑答案,因为它毕竟是一个非常好的答案。但由于 OP 显然不擅长数字系统和位运算,我认为这应该是答案的一部分。
【解决方案2】:

使用Integer.parseInt(),指定基数为16

int number = Integer.parseInt(myHexaNumber, 16);

【讨论】:

    【解决方案3】:

    数字不是“十六进制”或“十进制”。这只是由于懒惰而使用的不精确的拼写。数字表示十进制或十六进制将是精确的。无需将 int 从十进制转换为十六进制。事实上,无论您在代码中使用什么符号,它们都以二进制格式存储。唯一与符号相关的点是用户交互或编码期间,例如输入和输出数字,或在代码中指定常量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 2017-10-06
      • 2015-01-26
      • 1970-01-01
      • 2013-05-31
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多