【问题标题】:Simplify the inverse of Z = X ^ (X << Y) function简化 Z = X ^ (X << Y) 函数的逆函数
【发布时间】:2015-10-09 21:29:09
【问题描述】:

我很难将以下函数简化为几个原子二进制操作,感觉有可能但是我无法做到,我已经摸索了几个小时了:

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 &lt;&lt; Y) 的倒数,即reverse_xor_lshift(Z, Y) == X

【问题讨论】:

    标签: algorithm binary


    【解决方案1】:

    您可以使用与converting back from grey code 中使用的相同技术,用更少的操作进行逆运算,但方式更难理解:

    应用z ^= z &lt;&lt; i 转换,其中ishift 开始,每次迭代加倍。

    在伪代码中:

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

    这是可行的,因为在第一步中,您将最低位(不受影响)与它们“异或”的位置相异或,从而“将它们异或”。那么改成原来的那部分宽度是原来的两倍。然后新数字的形式为x ^ (x &lt;&lt; k) ^ (x &lt;&lt; k) ^ (x &lt;&lt; 2k) = x ^ (x &lt;&lt; 2k),这又是相同的东西,但偏移量是两倍,所以同样的技巧将再次起作用,解码更多的原始位。

    【讨论】:

    • 太令人惊讶了,George Marsaglia 发现了 en.wikipedia.org/wiki/Xorshift 这样的东西。 XorShift RNG 的构建块操作之一是 X ^ (X >> Y) 转换,知道它与格雷码编码有关,可以从全新的角度看待现有问题,谢谢
    猜你喜欢
    • 2015-10-30
    • 2017-12-27
    • 2013-02-26
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多