2

在 Java 中:

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

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

我相信我应该使用遮罩,但我不知道从哪里开始。给定一个字节数,如何更改所有 8 位。切换一个关闭或打开很容易,但是将所有 8 位切换为某个值?

4

2 回答 2

1

看看下面的例子:

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 和 OR。你必须研究这些东西才能知道它是如何工作的。

于 2015-09-02T04:00:27.587 回答
0

在一行中,假设字节是从最不重要的字节开始计算的:

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

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

代码的作用如下:

  • 创建一个掩码来“删除”旧字节(清除该字节的位)。为了创建面具:

    • 创建所有位集的一个字节的掩码(全部为 1)0xFF
    • 将此掩码偏移到要“删除”的字节的位置,它必须是要“删除”的字节数的 8 倍。由于我不能相乘(您的限制的一部分),所以我将这个数字向左偏移 3 位(相当于乘以 8,请记住,将这些位向左移动一个位置相当于乘以 2,所以3 的偏移量将是 2 * 2 * 2 = 8) 这是通过这段代码完成的:(byteNumber << 3)
    • 用 来“切换”掩码的位~,所以我有掩码来“删除”字节:~(0xFF << (byteNumber << 3))此时您的掩码将是,假设FFFF00FF您想清除字节#1
  • 在原始数字和第一步中创建的掩码之间执行逐位运算:~(0xFF << (byteNumber << 3))

  • 用新字节创建一个 32 位整数,并将其位偏移到字节的位置。同样,(byteNumber << 3)已经解释了偏移量。
  • 使用第二步的结果执行或按位操作以设置新字节的位(这是代码行,最后一步)

现在,我这样做((int)newByte) & 0xFF)而不是 just((int)newByte))或 just的原因是 JVM在执行操作之前newByte提升给int操作员,如果您的 newByte 大于 0x7F (例如,值将是转换为 as而不是)。通过这样做,我正在自己进行促销并清除不需要的位以防万一。byte<<0x80int0xFFFFFF800x00000080((int)newByte) & 0xFF)int

于 2015-09-02T04:08:27.243 回答