我在汇编时遇到编程作业问题。我必须在控制台中输入2个数字,然后传播炸弹"。我必须弄清楚这两个数字是什么的唯一线索是阅读汇编代码。在汇编代码中,有3个标准,数字(让他们称之为a和b)必须满足:
a + b = 3997
((2 * a) & a) & ((2 * a) & a) = 0
(a ^ b) & (a ^ b) <= 0
为了澄清,*
是乘法运算符,+
是加法运算符,&
是按位AND运算符,^
是按位异或运算符
让我难过。任何见解都将不胜感激。
谢谢!
答案 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
表示a
和b
在符号位上有所不同,即一个为正或零,另一个为负。
这些给我们留下了一些选择的自由。对于点#2,我们可以简单地选择大于3997
的2的幂,然后通过从3997
减去来计算另一个数。例如,a = 4096
,b = -99
:
还有很多其他解决方案。