1

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也可以。

还有其他不那么冗长的选项吗?

4

1 回答 1

1

我发现这个算法在 JavaIntegerLong类中不那么冗长。不过,我完全不知道为什么它应该以这种方式工作:

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;
}
于 2011-10-31T06:38:12.783 回答