y = x ^ (x << n)
に対して(y >> n) ^ (y >> (n-1)) ^ ... ^ (y >> 1)
で復元ができる。右シフトも同様。for (i=1; i<32-n; i*=2) y = y << i
でより効率的に計算することができる。ps1 = s0
として逆算を行っているが、実際はこれでは最上位bitの情報が復元されていない。x
とs2
まで復元できたら、ps1 = s0
とする代わりにps1 = (s0 & 0x7FFFFFFF) ^ ((x ^ s2) & 0x80000000)
とすれば、S1が完全に復元できる(つまり最上位bitはS0ではなくx ^ s2
の最上位bitを使う)。