IA32集会号码之谜

时间:2014-05-14 06:22:04

标签: assembly bit-manipulation ia-32

我在汇编时遇到编程作业问题。我必须在控制台中输入2个数字,然后传播炸弹"。我必须弄清楚这两个数字是什么的唯一线索是阅读汇编代码。在汇编代码中,有3个标准,数字(让他们称之为a和b)必须满足:

  1. a + b = 3997

  2. ((2 * a) & a) & ((2 * a) & a) = 0

  3. (a ^ b) & (a ^ b) <= 0

  4. 为了澄清,*是乘法运算符,+是加法运算符,&是按位AND运算符,^是按位异或运算符

    让我难过。任何见解都将不胜感激。

    谢谢!

1 个答案:

答案 0 :(得分:2)

从第2点开始:x & x = 0当且仅当x = 0时,(2 * a) & a = 0。由于乘以2是单个位移,我们可以看到对于没有彼此相邻的两个设置位的任何数字都是如此。

从第3点开始:x & x <= 0当且仅当x <= 0时,这意味着a ^ b <= 0。如果a ^ b = 0表示a = b,而点#1不允许,因为3997是奇数。因此,a ^ b < 0表示ab在符号位上有所不同,即一个为正或零,另一个为负。

这些给我们留下了一些选择的自由。对于点#2,我们可以简单地选择大于3997的2的幂,然后通过从3997减去来计算另一个数。例如,a = 4096b = -99

  1. 4096 +( - 99)= 3997
  2. ((2 * 4096)&amp; 4096)&amp; ((2 * 4096)&amp; 4096)= 0
  3. (4096 ^ -99)&amp; (4096 ^ -99)= -4195
  4. 还有很多其他解决方案。