给定函数H(A,B)=(A ^ B)^((A&B)<< 1)的输出C,如何编写输出给定C和B的A的函数?

时间:2019-03-13 06:08:13

标签: javascript algorithm bit-manipulation

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

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

此功能的描述可以在NORX规范中找到(链接在this page中可用)。

我需要实现H reverse 功能(使用Javascript)。也就是说,在给定cb的情况下,该函数需要输出a

规范为逆函数提供了一种算法(假设v[i]表示整数i的第v位):

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的元素,因此我们假设N是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
};

但是此功能不正确(它不会输出正确的结果)。如何实现H的反向功能?

2 个答案:

答案 0 :(得分:2)

这是我的快速尝试:

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是整数的大小。

答案 1 :(得分:2)

另一种基于位方程的版本,从位0,位1到位 i

  

c 0 = a 0 ⊕b 0
  c 1 = a 1 ⊕b 1 ⊕a 0 b 0
  ...
  c i = a i ⊕b i ⊕a i-1 b i-1

基于equation的属性,根据这些等式从 b c 中找到 a

  

a 0 = c 0 ⊕b 0
  a 1 = c 1 ⊕b 1 ⊕a 0 b 0
  ...
  a i = c i ⊕b i ⊕a i-1 b i-1

我们可以编写一个小程序(此处为32位),其功能与方程式完全相同

const int N = 32;

unsigned revH(unsigned c, unsigned b) {
     unsigned a = (c ^ b) & 1;     // bit 0
     for(int i=1 ; i<N ; i++) {    // bit i
          a |= ((c ^ b) & (1<<i)) ^ (((a & b) & (1<<(i-1))) << 1);
     }
    return a;
}