1

MySQLのbit_count関数は、場合によっては非常に便利です。

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

それをサポートしていない他のデータベースでその関数を使用したいと思います。これを行う最も簡単な方法は何ですか(DDLレベルでクライアントデータベースにアクセスできないため、ストアド関数を作成せずに)。

かなり冗長なオプションの1つは、これです(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

Integerこのアルゴリズムは、Javaおよび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;
}
于 2011-10-31T06:38:12.783 に答える