c - 如何在 C 中实现移位运算的逆运算?

标签 c bit-manipulation reverse-engineering

当对使用位移操作的 C 代码进行逆向工程时,我对下面的代码逆向操作背后的方法感到困惑。

unsigned char red = 37;
unsigned char blue = 100;
unsigned char green = 77
unsigned short us = (red << 8) + (blue);
us = (us << 5 ) | (us >> 11);
unsigned int threebytes = (us << 8) + green;

由于 NOT 是反转位的操作,我假设我可以实现 NOT 来反转每行或代码末尾的位,但是,我的结果与导致我的预期输出不匹配相信我已经陷入了误会。我对逆向工程有什么不明白的地方?

最佳答案

这似乎是理解 C 位运算的类练习。它似乎进一步假设 unsigned char是八位和 unsigned short是 16 位,很可能 unsigned int是32位的。您在本练习中的工作是了解哪些位被移动到何处,并设计新的操作,将这些位从 threebytes 中的结果值移动。返回到三个单独变量中的原始值。

以下是理解代码的一些帮助:

unsigned short us = (red << 8) + (blue);

此代码改变 red 的值左(高)八位并放入 blue 的值在低八位。

us = (us << 5 ) | (us >> 11);

这实际上执行了位循环。假设我们将 16 位标记为 us以便我们可以跟踪它们:

fedcba9876543210

表达式us << 5以 16 位生成(由于 C 规则,中间结果实际上有 32,但高 16 稍后将被丢弃,因此我们忽略它们):

a9876543210_____

下划线表示移入的新 0 位。其他数字是先前位值的标签。

表达式us >> 11产生这个:

___________fedcb.

当这些与 | 组合时在(us << 5) | (us >> 11)`,结果是:

a9876543210fedcb

因此,原始位 fedcba9876543210已旋转为 a9876543210fedcb .

然后这个:

unsigned int threebytes = (us << 8) + green

us 移动 16 位留下八位并插入 green 的值在低八位。

由此,您应该能够理解red中的所有位在哪里。 , blue ,和green最终为 threebytes 。然后练习就是编写新代码,将这些位从 threebytes 移走。回到单独的变量。

关于c - 如何在 C 中实现移位运算的逆运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443215/

相关文章:

c - 修改目录中的文件时不会触发目录上的 kqueue

无法从Linux字符设备读取

java - 使用右移对整数进行编码

memory-management - 图像基地址、虚拟地址和相对虚拟地址有什么区别?

c - 将多行值设置为 GDB 中的变量

c++ - 用于检查数字是否在特定范围内的位旋转

c - 为 64 位变量分配位

c++ - c++ exe 中的时间戳是什么(使用 MIDL 的 IDL 到 TLB 文件)

java - Android:Java:Proguard:如何:验证我的 jar(不同的 jar 项目)/apk 是否已成功处理? (我正在考虑对其进行逆向工程)

c - C中哪个循环更快? while 循环或 do-while 循环