综述
0xff 是一个以十六进制数字系统(基数为 16)表示的数字。它由两个十六进制的 F 数字组成。众所周知,十六进制中的 F 相当于二进制数字系统中的 1111。所以,二进制的 0xff 是 11111111。
我们将了解如何使用0xff值。此外,我们将了解如何使用多种数据类型表示它,以及如何与&操作符一起使用它。最后,我们将回顾使用它的一些好处。
用不同的数据类型表示0xff
Java 允许我们通过使用 0x 前缀和整数文字来定义解释为十六进制(基数为 16)的数字。0xff 相当于无符号十进制的 255、有符号十进制的 -127 和二进制的 11111111。
因此,如果我们定义一个值为 0xff 的 int 变量,由于 Java 使用 32 位表示整数,因此 0xff 的值为 255:
int x = 0xff;
assertEquals(255, x);
但是,如果我们定义一个值为 0xff 的字节变量,因为 Java 使用 8 位表示一个字节,并且因为字节是有符号数据类型,所以 0xff 的值为 -1:
byte y = (byte) 0xff;
assertEquals(-1, y);
如我们所见,当我们定义一个值为 0xff 的字节变量时,我们需要将其向下转换为字节,因为字节数据类型的范围是从 -128 到 127。
& 0xff 操作的常见用法
& 运算符执行按位与运算。如果两个操作数的相应位为 1,则按位 AND 的输出为 1。另一方面,如果操作数的任一位为 0,则相应位的结果被计算为 0。
由于 0xff 在最后 8 位中有 8 个 1,因此它为按位 AND 运算的标识元素。因此,如果我们应用 x & 0xff 操作,它将为我们提供 x 的最低 8 位,如果数字 x 小于 255,结果与x是相同的,否则,它将是 x 的最低 8 位。
通常,& 0xff 操作为我们提供了一种从数字中提取最低 8 位的简单方法。实际上可以使用它来提取我们需要的任何8位,因为我们可以向右移动我们希望成为最低位的任何8位,然后,我们可以通过应用& 0xff操作来提取它们。
使用 & 0xff 提取 RGBA 颜色坐标
假设我们有一个整数 x,以 32 位存储,表示 RGBA 系统中的一种颜色,这意味着它的每个参数(R、G、B 和 A)有 8 位:
- R = 16 (00010000 in binary)
- G = 57 (00111001 in binary)
- B = 168 (10101000 in binary)
- A = 7 (00000111 in binary)
因此,二进制中的 x 将表示为 00010000 00111001 10101000 00000111——相当于十进制的 272214023。现在,我们有十进制的 x 值,我们想要提取每个参数的值。
正如我们所知,>> 操作将位右移。因此,当我们执行 (10000000 00000000 >> 8) 时,它返回 10000000。因此,我们可以提取每个参数的值:
int rgba = 272214023;
int r = rgba >> 24 & 0xff;
assertEquals(16, r);
int g = rgba >> 16 & 0xff;
assertEquals(57, g);
int b = rgba >> 8 & 0xff;
assertEquals(168, b);
int a = rgba & 0xff;
assertEquals(7, a);
结论
我们讨论了 & 0xff 操作如何有效地以仅保留最后 8 位中的值并忽略其余位的方式划分变量。正如我们所见,当我们将变量右移并需要提取移位后的位时,此操作特别有用。