我正在寻找一种在bitset中找到连续的set或unset位块的方法,例如在bitset 01010111010
中,如果我正在寻找3个设置位,我希望得到6作为结果(从1开始计数,如果我从0开始计数,则为5。
另外,这是针对OS-dev的,所以没有stdlib可以为我做这个。
答案 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表示法,因此您必须进行一些移位,复制等操作才能创建比特流。