Как смоделировать функцию MySQL bit_count в Sybase SQL Anywhere?
Функция MySQL bit_count довольно полезна в некоторых случаях:
http://dev.mysql.com/doc/refman/5.5/en/bit-functions.html
Теперь я хотел бы использовать эту функцию в других базах данных, которые ее не поддерживают. Какой самый простой способ сделать это (без создания хранимой функции, так как у меня нет доступа к клиентской базе данных на уровне DDL).
Один довольно подробный вариант это (для TINYINT
типы данных):
SELECT (my_field & 1) +
(my_field & 2) >> 1 +
(my_field & 4) >> 2 +
(my_field & 8) >> 3 +
(my_field & 16) >> 4 +
...
(my_field & 128) >> 7
FROM my_table
В случае Sybase SQL Anywhere >>
оператор не доступен, поэтому деление на 2, 4, 8, 16
работает так же.
Любые другие, менее подробные варианты?
1 ответ
Решение
Я нашел этот алгоритм, который немного менее многословен в Java Integer
а также Long
классы. Я совершенно не понимаю, почему это должно работать именно так:
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}