gpt4 book ai didi

c - 十六进制删除前导数字

转载 作者:太空宇宙 更新时间:2023-11-04 07:17:44 24 4
gpt4 key购买 nike

当您执行类似 0x01AE1 - 0x01AEA = ffffff7 的操作时。我只想要最后 3 位数字。所以我使用模数技巧来删除多余的数字。位移被十六进制值填充。

  int extra_crap = 0; 
int extra_crap1 = 0;
int displacement = 0;
int val1 = 0;
int val2 = 0;

displacement val1 - val2;
extra_crap = displacement % 0x100;
extra_crap1 = displacement % 256;
printf(" extra_crap is %x \n", extra_crap);
printf(" extra_crap1 is %x \n", extra_crap1);

不幸的是,这根本没有效果。还有另一种方法可以删除除最后 3 位以外的所有数字吗?

最佳答案

“不幸的是,这根本没有效果。”

这可能是因为您对 signed int 进行了计算。尝试将值转换为 unsigned,或者干脆忘记求余运算符 % 并使用按位掩码:

displacement & 0xFF;
displacement & 255;

对于两个十六进制数字或

displacement & 0xFFF;
displacement & 4095;

三位数。

编辑——一些解释

详细的答案会很长...您需要了解 C 中使用的数据类型(尤其是 intunsigned int,这是最常见的两种使用了 Integral types ),可以在这些类型中表示的值范围及其在 Two's complement 中的内部表示代码。还有关于 Integer overflowHexadecimal system .

然后你会很容易地得到你的数据发生了什么:减去0x01AE1 - 0x01AEA,即6881 - 6890,得到-9的结果code>,用 2 的补码编码并以十六进制打印的 32 位有符号整数为 FFFFFFF7。 MINUS 9 除以 256 得到商零和 Remainder减九,所以余数运算符 % 给了你一个精确和正确的结果。你所说的“完全没有效果”只是你不了解你实际在做什么的结果。

我上面的答案(变体 1)不是任何魔法,而只是一种强制计算正数的方法。将值转换为 unsigned 类型会使程序将 0xFFFFFFF7 解释为 4294967287,除以 265(十六进制的 0x100)得到商 16777215 (0xFFFFFF) 和余数 247 (0xF7) .变体 2 根本不做除法,只是“屏蔽”那些必要的位:数字 255 和 4095 包含 8 和 12 个低位等于 1(分别为十六进制 0xFF 和 0xFFF),因此 bitwise AND完全按照您的意愿行事:删除值的较高部分,只留下所需的两个或三个低位十六进制数字。

关于c - 十六进制删除前导数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23250985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com