(注意: - 我在这里写的代码中可能存在语法错误)
我有一个包含2个字段的表
创建表跟踪 ( TraceName VARCHAR(100), BlockVector VARCHAR(MAX), NumHits INT);
表中有大约1百万个参赛作品。
我希望从该表中获得以下内容:
1)对于每一行,使用另一个长度相同的VARCHAR对BlockVector列进行按位异或,并在NumHits列中存储设置位数
2)查找NumHits列的最大值。
为了在T-SQL中查找XOR,我们可以使用'^'运算符。如何查找设置位数。
任何帮助都会得到很好的赞赏。
答案 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