查找Varbinary,SQL Server 2012中设置的位数

时间:2013-08-30 09:48:01

标签: sql sql-server sql-server-2008 tsql

(注意: - 我在这里写的代码中可能存在语法错误)

我有一个包含2个字段的表

创建表跟踪 ( TraceName VARCHAR(100), BlockVector VARCHAR(MAX), NumHits INT);

表中有大约1百万个参赛作品。

我希望从该表中获得以下内容:

1)对于每一行,使用另一个长度相同的VARCHAR对BlockVector列进行按位异或,并在NumHits列中存储设置位数

2)查找NumHits列的最大值。

为了在T-SQL中查找XOR,我们可以使用'^'运算符。如何查找设置位数。

任何帮助都会得到很好的赞赏。

1 个答案:

答案 0 :(得分:1)

以下函数可用于计算整数中的设置位数:

CREATE FUNCTION dbo.bit_count (@num AS BIGINT)RETURNS INT AS
BEGIN
    DECLARE @msb INT
    SET @msb = 0

    IF @num < 0
    BEGIN -- BIGINT is signed so treat the MSB differently
        SET @msb = 1
        SET @num = 0x7FFFFFFFFFFFFFFF & @num
    END

    SET @num = @num - ((@num / 2) & 0x5555555555555555)
    SET @num = (@num & 0x3333333333333333) + ((@num / 4) & 0x3333333333333333)
    SET @num = (@num + @num / 0x10) & 0x0F0F0F0F0F0F0F0F
    SET @num = @num + @num / 0x100
    SET @num = @num + @num / 0x10000
    SET @num = @num + @num / 0x100000000

    RETURN (@num & 0x3F) + @msb
END

注意:我没有编写该功能,也没有测试过。我在这里找到了: http://www.dbforums.com/microsoft-sql-server/1630934-bit-counting.html#post6342950