将 std::vector<unsigned int> 解释为位向量 - 高效算法?
Interpreting a std::vector<unsigned int> as bitvector - efficient algorithm?
我想解释一下
std::vector<unsigned int> numbers
为位向量,即numbers[0]
的MSB为第1位,numbers[1]
的MSB为第33位,以此类推。我想在这个向量中找到Ones的所有序列,并将相应的位置存储在一个数据结构中。(同样一个一个在这里被定义为序列)
例如:我将值15和112存储在数字中。因此,第29位到32位和第58位到60位等于1。挑战在于优化这个函数的运行时间。
下面是我处理这个问题的想法:我想用两个来处理-循环。第一个循环是遍历"numbers"的元素(我们称之为element_loop),而第二个循环用于计算单个元素中所有one的位置(我们称之为bit_loop)。为此,我想到了检测序列的"上升边"answers"下降边"。在每个bit_loop循环开始时,将掩码初始化为十六进制。value 0x80000000
。通过这个掩码,我检查第1位是否等于1。如果是,则存储当前位置(0)。接下来,二进制表示的掩码"1000…"用于检测下一个周期的"下降沿"。如果没有,掩码将向右移动一位"0100…",以便在下一个周期中检测"上升沿"。(我只关心这两个粗体数字)
一旦检测到边缘,我存储当前位置并以适当的方式将掩码移动一位。因此,在post . edge (01)之后,我切换到负。边缘检测(10),反之亦然。当遍历32位未符号数时,我将所有的边位置存储在某种向量中。这个向量可以是2 '数组,其中第一列是单序列的开始,第二列是序列的结束。此外,我需要对从一个元素到下一个元素的转换进行一些特殊处理。
这是我的一般性问题:你觉得这种方法怎么样?有没有更有效的处理方法?提前感谢您的帮助。 本有各种有效的位扫描技巧,但是如果您使用的是c++,则可以利用std::bitset
或boost::dynamic_bitset
来迭代位位置。您所描述的算法对每个块向后迭代,所以您可能希望使用32 - (32 - i)
之类的东西来反转您的位置。
根据体系结构的不同,每个比特大约需要一个周期。
可以使用特殊的处理器指令或各种巧妙的技巧(例如设置的最低有效位的位置)来查找单词中第一个位的有效方法(常数时间)。
小心一点,你可以反向工作,使用这些扫描第一个,然后做一些屏蔽和位翻转,搜索下一个零,等等。
这个可能给你一个更快的算法,特别是如果序列平均很长,所以快速扫描的增益超过了位旋转的成本。
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- C++中高效的大型稀疏块压缩线性方程
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 字符串的内存高效向量
- 如何高效更改向量中所有对象的成员数据?
- 向量的高效组合最小值和平均值计算
- 高效计算两个向量公共元素的索引
- 犰狳C ++:将矩阵的每一行乘以向量的高效简洁的方法
- 从字符* 高效实例化向量<char>
- 在 C++11 中高效复制向量
- 针对大型嵌套向量的高效内存分配
- 对定义顺序的向量的子集进行高效排序
- 将 std::vector<unsigned int> 解释为位向量 - 高效算法?
- 具有向量键的高效C++关联容器
- 一种用内部向量填充结构向量的优雅/高效方法
- 如何以特定的方式高效地比较向量和数组