没有ixor ~
if(~(i3 + -1) < -1) { ... }
会是这个吗?
if((i3 + 1) > 0) { ... }
或(怀疑这个?)
if((i3 + 0) > 0) { ... }
或(怀疑这个?)
if(i3 < -1) { ... }
谢谢我真的无法自己测试它我可以......但我正在写一个反混淆器,我想100%肯定。
答案 0 :(得分:3)
~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(以及大多数编程语言)现在的行为都是这样。
答案 1 :(得分:0)
首先,我假设这是Java,i3
是int
(与byte
,short
或{{1一样}})。
long
是i3 + -1
,它只是一个整数。
i3-1
不是。所以我们减去了一个并否定了所有的比特。这与否定two's complement数字完全相反。 (取消两个补码通常通过添加1然后补充来完成)。幸运的是,这个操作是它自己的逆操作,所以相反的做法也是一种否定2的补码的方法。所以我们最终得到了~
。
您留下的-i3
与-i3 < -1
相同,而且{* 1}}可以获得无法模糊的效果。
答案 2 :(得分:0)
~x
实际上是-x - 1
因此,-(i3 - 1)
相当于-(i3 - 1) - 1
,等于-i3
所以,
if(~(i3 + -1) < -1) { ... }
相当于:
if(-i3 < -1) { ... } // or simply if(i3 > 1) { ... }