【问题标题】:java, set bit values on hex numberjava,在十六进制数上设置位值
【发布时间】:2016-04-24 02:49:42
【问题描述】:

给定一个 12 位的任意十六进制数,设置第 n 位值的最快方法是什么?例如,

0x100000000000

如何设置第10位为2,即102000000000。

查看java doc后,我认为可以在java中定义数字为

int hex = 0x100000000000;

我需要将其转换为 0x102000000000。我尽量避免使用任何现有的类,例如 BitSet,因为代码必须用 java 和纯 javascript 编写。谢谢

【问题讨论】:

  • @CMZS 你至少应该离开0x。否则会令人困惑。
  • 我已更改问题描述。它是一个十六进制数,有 12 位数字。每个数字的值可能从 0 到 F。
  • 在 Java(和大多数语言)中确实没有“十六进制数”这样的东西。这只是写下整数常量的一种方法,并不是它自己的特殊类型“保持为十六进制数”。因此,在“十六进制数”中设置一个位只是在 intlong 或其他中设置一个位
  • int 不够大,因为它只有 32 位长。
  • 我建议您在谈论十六进制数字时使用术语 hexit 或 nybble 而不是 digit,因为它们比 digit 不那么模棱两可。此外,您应该更喜欢从零开始的编号,以与通常的位编号方式保持一致,因此0x102000000000 中的 2 是十六进制 9,而不是 10。

标签: java hex bit-manipulation


【解决方案1】:

这是我在 Java 中使用位运算符的方法。它在 Javascript 中应该非常相似。

public static void main(String[] args)
{
    long hex = 0x2222222222222222L;

    System.out.printf("0x%x", replaceDigit(hex, 10, 1));
}

public static long replaceDigit(long originalValue, int digitPosition, int replacementDigit)
{
    // Clear the 4 bits (i.e. 1 digit) at the position requested
    originalValue &= ~(0x0FL << digitPosition * 4);

    // Now put the replacement value at the position requested
    originalValue |= (long) replacementDigit << digitPosition * 4;

    return originalValue;
}

【讨论】:

  • 'digit' 是一个非常令人困惑的 arg 名称选择。位置/位置也许?这绝对不是数字。
  • 我已经澄清了参数名称
猜你喜欢
  • 2015-01-14
  • 2019-04-21
  • 1970-01-01
  • 2020-02-09
  • 2014-11-20
  • 2022-09-26
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多