十六进制:在一个int中设置一个8位字节

Hexadecimal: Set an 8-bit byte in an int

在Java中:

我有一个十六进制形式的 32 位数字。我得到了一个特定的字节数(0-3,最低有效字节为 0),并告诉我需要用另一个字节替换该字节,该字节也以十六进制形式提供给我。例如:32 位数字 0xAAA5BBC6,将字节 1 替换为 0x17 得到 0xAAA517C6。

我不会使用任何转换、乘法、加法、减法或条件语句。我不能编写任何辅助方法,也不能从这个文件或另一个文件调用任何其他方法来实现任何方法。此外,这必须写在一行代码中。

我认为我应该使用掩码,但我不知道从哪里开始。给定一个字节数,我怎样才能更改所有 8 位。关闭或打开一个很容易,但是将所有 8 位切换为某个值?

看看下面的例子:

input   =    AA      A5         BB      C6  (in hex)
input   = 10101010 10100101 10111011 11000110 (in binary)
mask    =    FF       FF       00       FF  (in hex)
mask    = 11111111 11111111 00000000 11111111 (in binary) 
-------------------------------------------------------
input   = 10101010 10100101 00000000 11000110 (bitwise AND)
replace =    FF       FF       17       FF  (in hex)
replace = 11111111 11111111 00010111 11111111 (in binary) 
-------------------------------------------------------
input   = 10101010 10100101 00010111 11000110 (bitwise OR)
input   =    AA      A5         17      C6  (in hex)

最后一行是您想要的输出。可以看到,有两个按位运算,AND and OR。你必须大量研究这些才能知道它是如何工作的。

在一行中,假设字节数是从最低有效字节开始计算的:

int updatedValue = originalValue & ~(0xFF << (byteNumber << 3)) | ((((int)newByte) & 0xFF) << (byteNumber << 3));

其中:
originalValue 是你原来的 32 位整数
newByte 是给你替换旧字节的字节
byteNumber是字节数(0-3)

代码的作用如下:

  • 为"delete"旧字节创建掩码(清除该字节的位)。为了创建面具:

    • 创建所有位集的一个字节的掩码(全部在 1 中)0xFF
    • 将此掩码偏移到"deleted"字节的位置,它必须是"deleted"字节数的8倍。因为我不能乘法(你的部分限制),所以我将这个数字向左偏移 3 位(相当于乘以 8,请记住,将位向左移动一个位置相当于乘以 2,所以3 的偏移量将是 2 * 2 * 2 = 8)这是通过这段代码完成的:(byteNumber << 3)
    • "toggle" 掩码的位与 ~,所以我有掩码到 "delete" 字节:~(0xFF << (byteNumber << 3)) 此时你的掩码将是,说FFFF00FF 如果你想清除字节 #1
  • 将原始数字与第一步创建的掩码进行与位运算:~(0xFF << (byteNumber << 3))

  • 用新字节创建一个 32 位整数并将其位偏移到字节的位置。同样,偏移量是用已经解释过的 (byteNumber << 3) 完成的。
  • 对第二步的结果进行或位运算,设置新字节的位(这是代码行,最后一步)

现在,我做 ((int)newByte) & 0xFF) 而不是 ((int)newByte))newByte 的原因是 JVM 将运算符 int 提升为 int =25=] 在执行操作 << 之前,如果您的 newByte 大于 0x7F(例如,值 0x80 将被转换为 int 作为 0xFFFFFF80 而不是 0x00000080)。通过执行 ((int)newByte) & 0xFF),我将自己升级到 int,并清除不需要的位以防万一。