我正在尝试将以下函数简化为几个原子二进制操作,虽然感觉可能性很大,但我却做不到。已经想了好几个小时了:
public UInt32 reverse_xor_lshift(UInt32 y, Int32 shift)
{
var x = y & (UInt32)((1 << shift) - 1);
for (int i = 0; i < (32 - shift); i++) {
var bit = ((x & (1 << i)) >> i) ^ ((y & (1 << (shift + i))) >> (shift + i));
x |= (UInt32)(bit << (shift + i));
}
return x;
}
该函数的作用是计算 Z = X ^ (X << Y)
的反向操作,换句话说,reverse_xor_lshift(Z, Y) == X
。