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