我在Java中添加了两位比特的相应位,如下所示:
1 0 1 1 0 0
1 0 1 0 1 0
====================
2 0 2 1 1 0
在此之后我将结果添加为:
2+0+2+1+1+0 = 6
现在,我必须在结果(6)中找出匹配位和非匹配位的1ns和2s的数量。我努力设置这样一个算法,它可以告诉我结果由1ns和2s组成的确切数量,但到目前为止我无法创建任何数据。 它允许每个加法结果乘以常数。可以减去各个位以实现上述目标。
我也可以像上面添加的那样将这些单位相乘。但我不能添加这些位也不是结果。比特可以与自身或任何其他比特相乘。即使我可以用我选择的数字来表示这些位。那就是我可以说1 = 2和0 = 3然后我可以:
添加(Pascal Paillier):
2 3 2 2 3 3
2 3 2 3 2 3
====================
4 6 4 5 5 9
对于乘法(RSA)
2 3 2 2 3 3
2 3 2 3 2 3
====================
4 9 4 6 6 9
唯一的目的是找出相似位(1& 1)的数量,并通过添加来生成总数中的非相似位(0& 1,1& 0) (Pascal Paillier)或乘法(RSA)。 此外,第二比特流可以用与上述不同的数字表示。
以下也可以使用:
更多细节: 我使用Pascal Paillier同态算法来加密这些单独的位。 Pascal Paillier仅支持加密数据,因此我只需添加。我必须将此号码发送给某些应用程序,这些应用程序必须找出匹配位和非匹配位的确切数量。 此外,我可以使用RSA,但它只允许乘法。
答案 0 :(得分:0)
一般来说,从两个原始的 a 和 b 位流中,您需要执行类似
的操作popcnt(a XOR b) = # of non-matching bits (pairs of 0,1 and 1,0)
popcnt(a AND b) = # of matching 1-bits (pairs of 1,1)
其中 popcnt 是结果字符串的Hamming weight。
如果您碰巧在支持SSE4 POPCNT指令(过去7年生产的AMD和Intel处理器)的处理器上进行编译,这可能是解决问题的最佳方式。例如,两者的实现(一次从流 a 和 b 测试一个int大小的位数)
int nonmatch(int a, int b) {
return __builtin_popcount(a ^ b);
}
int match(int a, int b) {
return __builtin_popcount(a & b);
}
将产生汇编代码
; nonmatch
xor %esi, %edi
popcnt %edi, %eax
retq
; match
and %esi, %edi
popcnt %edi, %eax
retq
分别