仅使用比较运算符查找二进制数是否包含设置位(或连续设置位)

时间:2013-10-21 12:37:20

标签: algorithm mongodb search binary

我不确定这是否可能,但我不能让它出于某种原因。

我想知道在数据库中存储数字是否可以根据它是否设置了某个位来查询它。

示例:我存储的数字是12(1100),我想查询数据库,看看是否有任何数字设置了第2位(0100)。我不能在这里使用按位运算符。现在我想知道这样做的唯一方法是查询所有可能的二进制数排列。

查询所有可能的排列是唯一的方法吗?

2 个答案:

答案 0 :(得分:0)

你应该做这样的事情(x / 2 ^ b)%2 其中b是位数(基于零),/是整数除法,%是mod运算符,^是幂运算符。不确定如何在MongoDB中表达它,但它确实避免使用按位运算符。

db.whatever.find( { $where: "this.somefield / 4 % 2 == 1" } )

对于从b位开始的连续n个连续位,要检查的表达式为:

(x / 2^b) % (2^n) == 2^n - 1

答案 1 :(得分:0)

由于MongoDB不包含按位运算符,因此没有一种有效的方法。它需要对每个文档进行全面扫描。虽然您可以使用JavaScript来执行find$where operator,但它不会很快,特别是对于大型集合而言,除了实验之外我不会推荐它:< / p>

var num = 2;   // checking 3rd bit 
var bit = (Math.pow(2, num)).toString();
var query = "(this.bitValue & " + bit + ") > 0";
db.testCollection.find( { $where: query } )

您可以通过对数字进行过滤来进一步优化它:

db.testCollection.find({ bitValue: { $gte : bit }, $where: query } )

然后您可以索引bitValue并仅查找大于或等于您正在检查的位的数字。这样可以防止全表扫描。