如何使用Java对十六进制整数进行掩码处理?

5

我有一个整数,其中包含一个十六进制值。我想从这个十六进制值中提取前几个字符,就像它是一个字符串值一样,但我不想将它转换为字符串。

int a = 0x63C5;
int afterMask= a & 0xFFF;
System.out.println(afterMask); // this gives me "3C5" but I want to get the value "63C" 

在我的情况下,我不能使用诸如 substring 这样的字符串实用程序。

3
你尝试过a >> 4吗? - BackSlash
4个回答

11

重要的是要理解整数只是一个数字。下面这些也没有区别:

int x = 0x10;
int x = 16;

两者最终都得到了相同值的整数。第一个是以十六进制形式在源代码中编写的,但仍代表相同的值。

现在,当涉及到掩码时,最简单的方法是将其看作二进制,因为操作将按位执行。因此,听起来你想要原始值的4-15位,但然后将其移位为结果的0-11位。

这可以最简单地表示为一个掩码,然后是一个移位:

int afterMask = (a & 0xFFF0) >> 4;

或者移位再掩码:

int afterMask = (a >> 4) & 0xFFF;

两者都会为您提供一个值为(decimal) 1596 = (hex) 63C。

在这种特殊情况下,由于您的输入没有位于12位及以上,因此掩码是不必要的 - 但如果您希望将输入0x1263c5仍然得到与0x63c相对应的输出,则需要该掩码。


9
如果您想要“63C”,只需要将其向右移动4位(以丢弃最右边的nibble)。例如,
int a = 0x63C5;
int afterMask = a >> 4;
System.out.println(Integer.toHexString(afterMask));

输出(按要求):63c

6
正确,但你写错了,应该是"Jon Skeet"。 - TheByeByeMan

3
  int a = 0x63C5;
  int aftermask = a >> 4 ;     
  System.out.println( String.format("%X", aftermask) );

0

你需要使用的掩码是0XFFF0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接