2011-11-29 117 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)' 但這並不奏效。 –

相關問題