Как смоделировать функцию MySQL bit_count в Sybase SQL Anywhere? - PullRequest
1 голос
/ 30 октября 2011

Функция MySQL bit_count довольно полезна в некоторых случаях:

http://dev.mysql.com/doc/refman/5.5/en/bit-functions.html#function_bit-count

Теперь я хотел бы использовать эту функцию в других базах данных, которые ее не поддерживают. Какой самый простой способ сделать это (без создания хранимой функции, поскольку у меня нет доступа к клиентской базе данных на уровне 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 Ответ

1 голос
/ 31 октября 2011

Я нашел этот алгоритм немного менее многословным в классах Integer и Long Java.Я совершенно не понимаю, почему это должно работать именно так:

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;
}
...