Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪种(Java)代码、库或算法最能提供位模式之间的相似性?_Java - Fatal编程技术网

哪种(Java)代码、库或算法最能提供位模式之间的相似性?

哪种(Java)代码、库或算法最能提供位模式之间的相似性?,java,Java,我追求的是一段代码、一个库例程或一个算法,该算法对两个不同的位或布尔模式的接近程度进行评分。当然,如果他们相等,那么分数应该是1,而如果一个都是真的,另一个都是假的,那么分数应该是0 位模式示例 我将要测试的位模式很多时候实际上并不相等或相同,但有时它们非常相似 0001 1111 0000 0000 1111 1100 0000 1110 0000 1110 0000 1111 在上面的例子中,1&2或1&3非常接近,如果我给它们打分,可能相差96%和95%。另一方面,1分和4分肯定会低很多

我追求的是一段代码、一个库例程或一个算法,该算法对两个不同的位或布尔模式的接近程度进行评分。当然,如果他们相等,那么分数应该是1,而如果一个都是真的,另一个都是假的,那么分数应该是0

位模式示例

我将要测试的位模式很多时候实际上并不相等或相同,但有时它们非常相似

0001 1111 0000
0000 1111 1100
0000 1110 0000
1110 0000 1111
在上面的例子中,1&2或1&3非常接近,如果我给它们打分,可能相差96%和95%。另一方面,1分和4分肯定会低很多,可能是25%

请注意,位模式可能具有不同的长度,但仍然可以进行评分

001100
000011110000
上述两种模式将被视为完全相同

001100
00110000

上述两种模式将被视为接近但不相同,因为一旦“缩放”了#2就不同于#1。

如果位模式的长度都相同,只需使用异或(
^
)运算符并计算剩余的零数

xor
如果两个对应的位相同,则产生一个零,否则产生一个一)


如果它们的长度不同,请将位模式视为字符串,并使用类似的方法。

我一直在尝试快速方法来计算逐位异或比较的匹配位数。以下是我认为最快的方法:

int num1, num2; // some bit patterns
int diff = num1 ^ num2;
int score;
for (score = 0; diff > 0; diff >>>= 1)
    score += diff & 1;
分数为零表示完全匹配(假设结果长度相同)

是核心库的一小部分

返回指定的
int
值的2位补码二进制表示形式中的1位数。此函数有时称为总体计数


我认为你需要更具体一些。这些模式相似吗<代码>10101010
01010101
?它们没有一个共同点,但它们是相似的(至少对我来说)@Kaj您的右边显示的模式非常接近,我的愿望组件将为它们评分相当高的95+。
diff>=1
在设置高位时将无限循环,因为
>
是符号扩展。你需要
diff>>>=1
或者不要通过执行
diff=diff&(diff-1)
迭代所有位,或者只使用
Integer.bitCount(…)
Hi@B看我的例子,你的检测有点简单,只适用于精确匹配。Xor不是很聪明,它没有距离的概念。1000 vs 0100比1000 vs 0001更接近,但两者的位差均为1位。因此,根据我的回答,转换为字符串并使用Levenshtein。它计算将字符串从一个更改为另一个所需的最小编辑次数。对于我的需要来说太简单了,请参考我的编辑以获取示例。@mP,在您定义问题之前,我无法帮助您。我可以指向
java.util.BitSet
。它是
nextSetBit
nextClearBit
方法,应该可以很容易地进行比特运行的实验。
public static int bitwiseEditDistance(int a, int b) {
  return Integer.bitCount(a ^ b);
}