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