算术移位分配率
Arithmetic shift distributivity
如果我有什么规则:
c = a xor (a>>b)
我知道c和b但不知道a。我该如何重写它才能解决?
所以基本上,我们不能只按照最初的建议重写方程式,但我们可以很容易地解决它:我们知道左狗屎只是加 0。示例如果 a = 123 和 b = 3:
a = 0b1111011
a >> 3 = 0b1111011000
现在假设我们只有 c
和 b
并且我们正在尝试求解原始问题中提出的方程式。我们说
b = 3
c = 2889 = 0b101101001001
我们知道我们的操作会这样做:
a^a000 = 0b101101001001 (1)
由于xor
是可逆的,我们可以改写(1):
a = 0b101101001001^a000
现在因为它是按位的,这已经给了我们 a 的最后 3 位数字:
a[-3:] = 001^000 = 001 (2)
现在我们的等式 (1) 变为,因为 a
的最后 3 个二进制数字是 a << 3
的第 6 到第 3 个数字:
a[:-3]001^a[:-3]001000 = 0b101101001001
我们再次重复 (2) 中的步骤,直到我们得到:
a[-6:] = 001001^001000 = 000001
a[-9:] = 101001001^000001000 = 101000001
Et voila,我们得到了原始的 a = 0b101000001 = 123
如果我有什么规则:
c = a xor (a>>b)
我知道c和b但不知道a。我该如何重写它才能解决?
所以基本上,我们不能只按照最初的建议重写方程式,但我们可以很容易地解决它:我们知道左狗屎只是加 0。示例如果 a = 123 和 b = 3:
a = 0b1111011
a >> 3 = 0b1111011000
现在假设我们只有 c
和 b
并且我们正在尝试求解原始问题中提出的方程式。我们说
b = 3
c = 2889 = 0b101101001001
我们知道我们的操作会这样做:
a^a000 = 0b101101001001 (1)
由于xor
是可逆的,我们可以改写(1):
a = 0b101101001001^a000
现在因为它是按位的,这已经给了我们 a 的最后 3 位数字:
a[-3:] = 001^000 = 001 (2)
现在我们的等式 (1) 变为,因为 a
的最后 3 个二进制数字是 a << 3
的第 6 到第 3 个数字:
a[:-3]001^a[:-3]001000 = 0b101101001001
我们再次重复 (2) 中的步骤,直到我们得到:
a[-6:] = 001001^001000 = 000001
a[-9:] = 101001001^000001000 = 101000001
Et voila,我们得到了原始的 a = 0b101000001 = 123