什么等价于没有 ixor~
if(~(i3 + -1) < -1) { ... }
.
会是这个吗?
if((i3 + 1) > 0) { ... }
或者(怀疑这个?)
if((i3 + 0) > 0) { ... }
或者(怀疑这个?)
if(i3 < -1) { ... }
谢谢,我自己不能真正测试它,我可以.. 但我正在写一个反混淆器,我想 100% 确定。
什么等价于没有 ixor~
if(~(i3 + -1) < -1) { ... }
.
会是这个吗?
if((i3 + 1) > 0) { ... }
或者(怀疑这个?)
if((i3 + 0) > 0) { ... }
或者(怀疑这个?)
if(i3 < -1) { ... }
谢谢,我自己不能真正测试它,我可以.. 但我正在写一个反混淆器,我想 100% 确定。
~x
是 的按位(非逻辑)反转x
。在二进制补码中,它等于-1 - x
。尝试一下。
~0 = -1 - 0 = -1
~-1 = -1 - -1 = 0
~1 = -1 - 1 = -2
现在,将此应用于您的情况:
-1 - (i3 - 1) < -1
-1 - i3 + 1 < -1 # commutative property of multiplication
- i3 < -1 # 1 + -1 == 0
i3 > 1 # * -1 inverts everything, including the inequality
请注意,这仅适用于数字是二进制补码的情况——但如今几乎所有 CPU(和大多数编程语言)都以这种方式运行。
首先,我假设这是 Java 并且那i3
是一个int
(与byte
,short
或相同long
)。
i3 + -1
是i3-1
这将是一些整数。
~
按位不是。所以我们减去了一个并否定了所有的位。这与否定二进制补码数完全相反。(否定一个二进制补码通常是通过加 1 然后补码来完成的)。幸运的是,这个运算是它自己的逆运算,所以做相反的事情也是一种否定数字的 2 补码的方法。所以我们最终得到了-i3
.
剩下-i3 < -1
的就是i3 > 1
尽可能不混淆的。
~x
实际上是-x - 1
因此,-(i3 - 1)
等价于-(i3 - 1) - 1
whcih 等于-i3
So,
if(~(i3 + -1) < -1) { ... }
相当于:
if(-i3 < -1) { ... } // or simply if(i3 > 1) { ... }