十六进制:在一个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
,并清除不需要的位以防万一。
在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
- 创建所有位集的一个字节的掩码(全部在 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
,并清除不需要的位以防万一。