繁体   English   中英

简化Z = X ^(X << Y)函数的逆

[英]Simplify the inverse of Z = X ^ (X << Y) function

我很难将以下函数简化为几个原子二进制操作,感觉它可能然而我无法做到,我已经抓了几个小时了:

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

您可以通过使用与从格雷码转换回来时使用的相同技术,以更少的操作来反转它,尽管以更难理解的方式:

应用变换z ^= z << i ,其中ishift开始,每次迭代加倍。

在伪代码中:

while (i < 32)
    x ^= x << i
    i *= 2

这是有效的,因为在第一步中,您将最低位(不受影响)放在它们被“xored in”的位置,从而“xoring out out”。 然后,已经更改为原始的部分是两倍宽。 那么新的数字是x ^ (x << k) ^ (x << k) ^ (x << 2k) = x ^ (x << 2k) ,这又是同样的事情,但偏移量是两倍,所以同样的技巧将再次起作用,解码更多的原始位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM