• 理解 Java 中的 &0xff 值


    综述

    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 位中的值并忽略其余位的方式划分变量。正如我们所见,当我们将变量右移并需要提取移位后的位时,此操作特别有用。

  • 相关阅读:
    博客作业01-抽象数据类型
    C语言最后一次作业--总结报告
    C语言博客作业--函数嵌套调用
    C语言博客作业--结构体
    数位DP之奥义
    POJ 3311 Hie with the Pie (状压DP)
    kaungbin_DP S (POJ 3666) Making the Grade
    POJ 3666 Making the Grade
    kuangbin_SegTree M (HDU 4553)
    kuangbin_SegTree I (HDU 1540)
  • 原文地址:https://www.cnblogs.com/CodePastry/p/14883937.html
Copyright © 2020-2023  润新知