如何在C语言中实现位移位的逆运算?

如何在C语言中实现位移位的逆运算?,c,bit-manipulation,reverse-engineering,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) + gr

当反向工程使用位移位操作的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来反转每行或代码末尾的位,但是,我的结果与预期的输出不匹配,这使我相信我产生了误解。我对逆向工程有什么不理解的?

我想你的意思是将三个字节解码回其组成的RGB组件

首先让我们看看三个字节是什么样子

第一步红色11是向左旋转5位,因此结果看起来像rrrb BBBBBR rrrr,其中底部的r位实际上是红色通道的顶部5位


最后一步是理解C位操作的课堂练习。它进一步假设无符号字符为8位,无符号短字符为16位,无符号整数可能为32位。本练习的任务是了解哪些位移动到了哪里,并设计新的操作,将位从三个字节的结果值移回三个单独变量中的原始值

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

unsigned short us = (red << 8) + (blue);
这将执行有效的位旋转。假设我们标记了16位,以便跟踪它们:

fedcba9876543210
表达式us>11产生以下结果:

___________fedcb.
当这些参数与| in us>11〃组合时,结果为:

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

那么这个,

unsigned int threebytes = (us << 8) + green
将16位从us向左移位8位,并将绿色值插入低位8位

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

由此,您应该能够理解红色、蓝色和绿色的所有位在三个字节中结束的位置。然后,练习是编写新代码,将这些位从三个字节移回单独的变量。

这不是所谓的反向工程,这里也没有not操作。如果你不知道运算符是什么,你需要先读一本C语言的书,我不在这里。如果向左移位,则可以使用向右移位的方式反转操作,反之亦然。您尚未解释预期的输出是什么。请这样做,输入和输出都使用二进制。
a9876543210fedcb
unsigned int threebytes = (us << 8) + green