假设a
和b
是无符号整数,请考虑以下函数:
function H(a, b) {
var c = (a ^ b) ^ ((a & b) << 1);
return c
};
此功能的描述可以在NORX规范中找到(链接在this page中可用)。
我需要实现H
的 reverse 功能(使用Javascript)。也就是说,在给定c
和b
的情况下,该函数需要输出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
的反向功能?
答案 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;
}