假设ab是无符号整数,请考虑以下函数:

function H(a, b) {
    var c = (a ^ b) ^ ((a & b) << 1);
    return c
};

这个函数的描述可以在NORX规范中找到(链接可以在this page中找到)。
我需要实现H的反向功能(在javascript中)。也就是说,给定cb,需要函数来输出a
规范提供了反向函数的算法(假设v[i]表示整数的第i位):
a[0] = c[0] XOR b[0];
a[1] = (c[1] XOR b[1]) XOR (a[0] AND b[0]);
...
a[i] = (c[i] XOR b[i]) XOR (a[i-1] AND b[i-1]);

但我不知道如何实现它。
我尝试了以下函数(注意,参数是UintNArrays的元素,所以我们假设v是8、16或32):
function revH(c, b) {
    var x = (c ^ b) >>> 0; var a = x;

    for (var i = 1; i < N; ++i) {
        x0 = (c ^ b) ^ ( (a >>> i) & (b >>> i ));
        a = (a & ~(0x1 << i)) | ((x >>> (N-i)) << i);
    };
    return a
};

但是这个函数不正确(它不输出正确的结果)如何实现N的反向功能?

最佳答案

下面是我的快速尝试:

function revH(c, b) {
    var cxorb = c ^ b;
    var a = cxorb & 0x1;
    for (var i = 1; i < N; ++i) {
        var x0 = cxorb & (0x1 << i);
        var x1 = (a & (0x1 << (i-1))) & (b & (0x1 << (i-1)));
        a = a | (x0 ^ (x1 << 1));
    }
    return a;
}

其中N是整数的位数。

关于javascript - 给定函数H(A,B)=(A ^ B)^((A&B)<< 1)的输出C,如何编写输出给定C和B的A的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55135450/

10-11 20:46
查看更多