我被告知x ^ ROR(x, 13) = 0x936f2a8247534566
^
是XOR运算符,就像在C中一样,ROR()
是一个函数,将输入的位按指定的位置旋转,例如Intel processor instruction。
问题是我如何找到x
。尝试每个64位组合似乎有很多可能性,也许有更好的方法?
答案 0 :(得分:13)
此算法
unsigned long long res = 0;
int bit = 1;
for (int k = 0, shift = 0; k < 64; k++, shift = (shift + 13) % 64)
{
if (bit)
res |= 1ull << shift;
if (0x936f2a8247534566 & (1ull << shift))
bit = 1 - bit;
}
给出答案
0x1337b33fdeadb00b
如果我们从bit = 0
开始,答案就是
0xecc84cc021524ff4
这个想法如下。如果0x936f2a8247534566
的最后一位是0
,则表示bit[13] ^ bit[0] == 0
,因此位相等。否则bit[0]
和bit[13]
会有所不同。
同样的逻辑适用于bit[13]
和bit[26]
等。所以基本上数字0x936f2a8247534566
告诉我们原始数字的哪些位彼此相等而哪些不相等。 / p>
从步骤13
开始,我们获得0
和63
(包括)之间的所有可能位置,我们只需要一个循环。