T-SQL 中的汉明权重/总体计数
我正在寻找一种快速方法来计算 BINARY(1024) 字段的汉明权重/总体计数/“1 位的数量”。 MySQL 有一个 BIT_COUNT 函数可以做类似的事情。我在T-SQL中找不到类似的函数?
或者您是否建议将二进制数据存储在另一种类型的字段中?
如果您不知道我在说什么,这里有一篇关于汉明权重的维基百科文章 。
I'm looking for a fast way to calculate the hamming weight/population count/"the number of 1 bits" of a BINARY(1024) field. MySQL has a BIT_COUNT function that does something like that. I couldn't find a similar function in T-SQL?
Or would you suggest storing the binary data in a field of another type?
If you don't know what I'm talking about, here's a Wikipedia article about the hamming weight.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用带有预先计算的汉明权重的辅助表来处理小数字(例如字节),然后相应地分割该值,加入到辅助表中并获取部分汉明权重的总和作为该值的汉明权重:
You could use a helper table with precalculated Hamming weights for small numbers, like bytes, then split the value accordingly, join to the helper table and get the sum of partial Hamming weights as the value's Hamming weight:
当您使用较小的值(例如最大 16 位)时,使用 SQL Server 执行此操作的最有效方法是使用计算所有结果的表并使用联接。
我通过在查询上执行此类操作将查询速度从 30 秒加快到 0 秒,该查询应该计算 17'000 行上 4 位值的汉明权重。
当然,这是一个丑陋的解决方案,并且可能不太适合长位字段。
When you are playing with smaller value (something like 16 bit max), The most efficient way to do it with SQL Server is using an Table with all result calculated and using a join.
I have speed up a query from 30 sec to 0 sec by doing this kind of thing on a query which should calculate Hamming Weight of a 4 bit value on 17'000 rows .
Of course it is an ugly solution and it probably won't suit well for long bit field.
从 SQL Server 2022 CTP 2.1 开始,SQL Server 支持 BIT_COUNT()。该文档是 这里。
SQL Server, as of SQL Server 2022 CTP 2.1, supports BIT_COUNT(). The documentation is here.
没有找到任何关于汉明权重的具体内容,但这里有一个汉明距离:
它计算两个值之间的汉明距离。单个值的汉明权重将是该值与零值数组之间的汉明距离。
Didn't find anything specifically about hamming weight, but here's one for hamming distance:
This computes the hamming distance between two values. The hamming weight of a single value would be the hamming distance between that value and an array of zero-values.
我找不到好的方法来做到这一点。最后我用Java计算了汉明权重并定期更新数据库中的位数。
I couldn't find a good way to do it. In the end I calculated the hamming weight in Java and periodically update the bit counts in the database.