Выполнять побитовые операции над большими битовыми строками в MySQL? - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть база данных MySQL с большим количеством 2048-битных двоичных строк (например, «0111001 ... 0101»).Одно из вычислений, которое мне понадобится, - это расстояние Хэмминга (общее количество единиц в результате XOR) этих строк по сравнению с некоторыми внешне сгенерированными цепочками битов.Чтобы получить представление о том, как написать этот запрос, я попытался написать его для небольших цепочек.Вот пример:

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

Внутренняя часть, которая вычисляет XOR, работает правильно, но BIT_COUNT возвращает странные результаты.Этот пример возвращает 14, что длиннее самой строки.

Итак, у меня есть несколько вопросов:

Во-первых, почему BIT_COUNT возвращает такие странные результаты.Работает ли он над строкой, а не над двоичной строкой, над которой я хотел бы работать?Если да, то как мне справиться с этим?

Во-вторых, обратите внимание, что я приведу (это правильное слово здесь?) Строки в двоичном виде, добавив b.Как бы я сделал это с именами столбцов и переменных?Очевидно, я не могу просто добавить ab к имени переменной и не могу вставить пробел между ними.Есть идеи?

Спасибо,

РЕДАКТИРОВАТЬ: Итак, вот решение первой проблемы:

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

Кажется, есть проблема при использовании этого для больших строк (2048 бит).Я попытался:

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

, и это дает мне результаты, например, 28, когда фактическое число битов должно быть около 1024. Если я удаляю b, то кажется, что оно достигает максимального значения в 64. Любые идеи о том, какрешить эту проблему?

1 Ответ

1 голос
/ 29 ноября 2011

Просто удалите функцию bin.При этом BIN_COUNT обрабатывает свой аргумент как строку символов, а не как набор битов.Так что

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

сделает всю работу

...