Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 解读标准::向量<;无符号整数>;作为位向量高效算法?_C++_Algorithm_Bitvector - Fatal编程技术网

C++ 解读标准::向量<;无符号整数>;作为位向量高效算法?

C++ 解读标准::向量<;无符号整数>;作为位向量高效算法?,c++,algorithm,bitvector,C++,Algorithm,Bitvector,我想翻译 std::vector<unsigned int> numbers std::向量数 作为位向量,即数字[0]的MSB是第1位,数字[1]的MSB是第33位,依此类推。我想找到这个向量中的所有序列,并将相应的位置存储在数据结构中。(此处也将单个定义为序列) 例如:我将值15和112存储在数字中。因此,位29至32和位58至60等于1。 挑战在于优化此函数的运行时 下面是我如何处理这个问题的想法:我想过使用两个for循环。第一个循环遍历“number”元素(我们称之为el

我想翻译

std::vector<unsigned int> numbers
std::向量数
作为位向量,即
数字[0]
的MSB是第1位,
数字[1]
的MSB是第33位,依此类推。我想找到这个向量中的所有序列,并将相应的位置存储在数据结构中。(此处也将单个定义为序列)

例如:我将值15和112存储在数字中。因此,位29至32和位58至60等于1。 挑战在于优化此函数的运行时

下面是我如何处理这个问题的想法:我想过使用两个for循环。第一个循环遍历“number”元素(我们称之为element_循环),而第二个循环用于计算单个元素中所有元素的位置(我们称之为bit_循环)。为此,我想到了检测序列的“上升边缘”和“下降边缘”

在每个位循环的开始,掩码被初始化为十六进制。值
0x8000000
。使用此掩码,我检查第一位是否等于1。如果是,则存储当前位置(0)。接下来,二进制表示的掩码“1000…”用于在下一个循环中检测“下降沿”。如果否,掩模向右移动一位“0100…”,以便在下一个循环中检测“上升沿”。(我只关心两个粗体数字)

一旦检测到边缘,我存储当前位置并以适当的方式将遮罩移动一位。因此,在位置边缘(01)之后,我切换到neg。边缘检测(10),反之亦然。在遍历32位usigned编号时,我将所有边位置存储在某种向量中。这个向量可能是2维的。数组,第一列是一个序列的开始,第二列是序列的结束。此外,我需要一些特殊的处理从一个元素到下一个元素的营业额

这是我的一般性问题:你认为这种方法怎么样?有没有办法更有效地处理这个问题?事先非常感谢你的帮助


< P>有很多位技巧来有效地进行位扫描,但是如果使用C++,则可以利用任一位或迭代位位。不过,您描述的算法会对每个块进行反向迭代,因此您可能希望使用类似
32-(32-i)
的方法反转位置

根据架构的不同,每个位大约需要一个周期

使用特殊的处理器指令或各种巧妙的技巧(参见示例),有一些高效(恒定时间)的方法来查找单词中的第一个位集

只要小心一点,你就可以向后工作,用它们来扫描第一个,然后做一些掩蔽和位翻转,搜索下一个零,等等


这可能会给你一个更快的算法,特别是如果序列平均很长,那么快速扫描的收益超过了位旋转的成本。

如果你想确保它是32位,同时隐式记录这个事实,请使用
uint32\u t
。嗯,你可以尝试std::vector或bitset。检查如何检查单个位是否设置的答案。我只能投票支持苏尔特的评论一次。抱歉@SurtHow您如何将MSB设为第1位???您是否有大端处理器或使用网络字节顺序?非常感谢您的提示!这就是我现在使用的:从LSB端开始,我用Debrijn序列检测第一个“1”。之后,我反转数字,并使用掩码(0xFFFFFF)将检测到的位的所有结果“1”设置为零