2011-10-30 35 views
1

MySQL的BIT_COUNT功能對於某些情況下非常有用:如何模擬Sybase SQL Anywhere中的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

我發現這個算法在Java的IntegerLong類中稍少一些。我完全沒有理解爲什麼它應該以這種方式工作:

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