4
我很难将以下函数简化为几个原子二进制运算,但感觉像是可能的,但是我无法做到这一点, “M抓我的头几个小时了:简化Z = X ^(X << Y)函数的逆函数
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
令人惊讶的是,George Marsaglia发现了https://en.wikipedia.org/wiki/Xorshift之类的东西。 XorShift RNG的构建块操作之一是X ^(X >> Y)变换,并且知道它与格雷码编码有关,可以从全新的角度看待现有问题,谢谢。 – Lu4