找到一组连续的设置/未设置位

时间:2015-07-24 07:46:32

标签: c operating-system bitset

我正在寻找一种在bitset中找到连续的set或unset位块的方法,例如在bitset 01010111010中,如果我正在寻找3个设置位,我希望得到6作为结果(从1开始计数,如果我从0开始计数,则为5。

另外,这是针对OS-dev的,所以没有stdlib可以为我做这个。

3 个答案:

答案 0 :(得分:3)

这是一个N阶方法,最好用一个例子来描述。

假设您的号码是x。

要找到3个连续的1位,从n = 7开始。(那是0b111。)计算x& ñ。如果是x,则在数字末尾连续有3位。

如果没有按位移位n得到0b1110。计算x&再一次。

继续,直到你到达(并测试)x中最重要的1位。

也许有更有效的方法,例如,覆盖0b1110111,这将需要更少的班次,但更复杂的表达成功。

答案 1 :(得分:3)

假设您正在查找整数n中的3个连续位。

首先,逐位AND值本身向右移1位和2位:

n = n & (n >> 1) & (n >> 2);

现在只设置作为3个连续位序列(从LSB开始)的开始的位。

如果需要连续检查3个以上,可以循环执行任意(但很小)的运行长度。

然后,找到设置的第一个位(从最低有效位计数为位0),使用快速位操作algorithm计算二进制数中的尾随零。

使用这种方法,您只需几次操作就可以一次搜索32或64位。但是,如果查看32位或64位整数字符串,它会变得更复杂,但是您可以为每个字重复该过程,在第一步中从下一个int移位较低位。

如果您要查找的连续位数很大,那么它也不是最佳的。

答案 2 :(得分:2)

没有代码,但有办法:创建一个移位寄存器,它保存你想要计算的位数,然后将你的比特流转移到它(用计数器跟踪)。如果您的移位注册中包含所有移动注册表,那么您就完成了。然后,计数器将成为该位置。

请注意,大多数计算机都使用little-endian表示法,因此您必须进行一些移位,复制等操作才能创建比特流。