2011-11-29 121 views
0

我有一个包含大量2048位二进制字符串(例如'0111001 ... 0101')的MySQL数据库。我需要的一个计算是这些字符串的汉明距离(在XOR'd结果中的总数为1)与一些外部生成的比特串相比较。为了了解如何编写这个查询,我试着写了一个更小的位串。下面是一个示例:在MySQL中对大字符串执行按位操作?

select BIT_COUNT(bin((b'0011100000')^(b'1111111111'))) 

计算异或的内部工作正常,但BIT_COUNT返回奇怪的结果。这个例子返回14,它比字符串本身更长。

所以,我有几个问题:

首先,为什么是BIT_COUNT返回这样奇怪的结果。它是使用字符串而不是二进制字符串来操作吗?如果是这样,我该如何处理?

第二,请注意我正在铸造(这是否是正确的词?)字符串作为二进制前面加上b。我将如何与列名和变量做到这一点?很明显,我不能简单地将b预先加入变量名称,而且我也不能在它们之间插入空格。有任何想法吗?

感谢,

编辑: 所以这里的第一个问题的解决方案:

select BIT_COUNT(b'0011100000'^b'1111111111') 

似乎使用这种较大的字符串(2048位)时,是一个问题。我想:

select BIT_COUNT(b'001110...00011') 

,这让我产生像28,当实际比特计数应该在1024如果我删除了B,那么它似乎最大输出为64。如何解决这个任何想法问题?

+0

蝙蝠 - 你有没有找到一个解决这个? – ChrisB

回答

1

只要删除bin函数。用它BIN_COUNT将它的参数视为一个字符串,而不是一组位。所以

select BIT_COUNT(b'0011100000'^b'1111111111') 

就做好了

+0

那么解决了一个问题。谢谢。但仍然存在将字符串变量视为位串(例如b'1101010 ...,但带有变量)的问题。任何想法如何做到这一点? –

+0

@Bat Masterson:定义'variable'。它来自哪里? – zerkms

+0

假设我有一个名为'mask'的列,并且我想与其他一些位代码进行异或运算,我们称之为'代码'。它们都是1和0的字符串。我如何编写声明来计算汉明距离?我试过 'select BIT_COUNT(mask^code)' 但这并不奏效。 –

相关问题