是否可以创建一个select查询来计算mysql中位操作的前导零数?我需要将其与阈值进行比较并返回结果。 Select-Query会经常被调用,但我认为每个基于SQL的解决方案都比我们当前将所有内容加载到内存然后在java中执行的策略更好。
功能示例:
unsigned INT with the value 1 -> 31, since there 32 bits and the rightmost is set
unsigned INT with the value 0x0C000000 -> 4, there are 4 zero bits from the highest order to the first set
然后我可以将结果与阈值进行比较,只获得高于阈值的值。
伪代码示例查询:
SELECT *
FROM data
WHERE numberOfLeadingZeros(data.data XOR parameter) >= threshold;
答案 0 :(得分:1)
您可以忽略零的计数,只需与阈值进行比较即可。例如,您知道32位值2
中有多少前导0。任何少于0的东西都是>2
,任何多于0的东西都是<2
。
因此,对于您的解决方案,不要执行查询number_of_zeros(x) >= threshold
,而是查询x < value_with_threshold_leading_zeros
。 (值为2^(31-number_of_zeros)
)
答案 1 :(得分:1)
这应该有用,但请看看@viraptor的建议:
SELECT * FROM data WHERE (32 - LENGTH(BIN(data))) >= threshold
这只是将整数转换为不带前导零的二进制字符串。因此,如果从32中减去此字符串的长度,则会得到数字中前导零的数量。