有没有办法在 C 中访问十六进制数的某些部分?
我想编写一个函数,它接受一个十六进制数并将其取反,但保持最低有效字节不变。例如:0x87654321 应该变成 0x789ABC21。
我试图以某种方式保存 LSB,然后将其应用于否定的 x,但我的问题是我的掩码被应用于所有字节。我可以针对特定值对其进行硬编码,但显然这不是我想要的。
void b(int x) {
int temp = x & 0xFF; // temp is all 0 with the LSB being the same as x's
x = ~x; // this negates x
// one of a couple of attempts I tried thus far:
// x = (x & 0x00) | temp;
// idea: change x's LSB to 00 and OR it with temp,
// changing x's LSB to temp's LSB
}
Run Code Online (Sandbox Code Playgroud)
如果您不发布解决方案的代码,我会很感激,而只是回答是否有一种方法可以将位操作应用于十六进制数的特定部分,或者我可能如何解决这个问题。
通常,您可以使用掩码对值的特定位进行操作。
掩码是位模式,您要操作的位置为 1,不操作的位置为 0。
似乎您需要 3 个操作:提取最低字节、否定、恢复最低字节。你可以找出否定,所以我只讨论提取位域和恢复提取的位域。
要提取指定位,请对所需位使用带 1 的掩码,并使用按位和运算符&。的和操作员设置为0掩模的全部为0,并且其中所述掩模是1,它拷贝从其它参数的位。如果您需要在程序的其他地方检查这个值,>>将值右移到最低位置也可能很方便(这样更容易在表格中查找)。
要恢复保存的位,如果您之前将其向下移,请向上移回。然后从值中清除这些位,并使用inclusive-or |作为所有一位的按位和。要清除值中的位,请使用第一个操作中的掩码的反转。IE。y = x & 0xf保存一个半字节,x & ~0xf清除该半字节,(x & ~0xf) | y重新组合为相同的原始 x。
编辑: 如果您提取的部分不在最低位置,例如 32 位无符号整数的第二个字节 (LSB),那么将提取的值移到零位置以使用它可能很有用。
x = 0x12345678;
y = x & 0xFF00; // == 0x5600
y >>= 8; // == 0x56
Run Code Online (Sandbox Code Playgroud)
但是如果你这样做,那么你必须在用位域的新值更新更大的值之前将它移回正确的位置(当然)。
x = (x & ~0xFF00) | (y << 8);
Run Code Online (Sandbox Code Playgroud)