C/C++ 位数组分辨率转换算法
C/C++ bit array resolution transform algorithms
>有人知道任何向上/向下转换位数组的算法吗?
即:当分辨率为 1/16 时:
每 1 位 = 16 位。(低分辨率到高分辨率(
1010 -> 1111111111111111000000000000000011111111111111110000000000000000
和反向,16 位 = 1 位(高分辨率到低分辨率(
1111111111111111000000000000000011111111111111110000000000000000 -> 1010
现在我正在一点一点地循环,效率不高。使用整个 64 位字会更好,但当字不能被分辨率整除时会遇到问题(某些位可能会溢出到下一个字(。
C++:
std::vector<uint64_t> bitset;
三:
uint64_t *bitset = calloc(total_bits >> 6, sizeof(uint64_t)); // free() when done
使用以下方法访问:
const uint64_t idx = bit >> 6;
const uint64_t pos = bit % 64;
const bool value = (bitset[idx] >> pos) & 1U;
并设置/清除:
bitset[idx] |= (1UL << pos);
bitset[idx] &= ~(1UL << pos);
并且两个相同分辨率的位集的 OR(或 AND/XOR/AND/NOT(是使用完整的 64 位字完成的:
bitset[idx] |= source.bitset[idx];
我正在处理足够大的位集(2+ 十亿位(,我正在寻找循环中的任何效率。我发现优化循环的一种方法是使用__builtin_popcountll
检查每个单词,并在循环中跳过:
for (uint64_t bit = 0; bit < total_bits; bit++)
{
const uint64_t idx = bit >> 6;
const uint64_t pos = bit % 64;
const uint64_t bits = __builtin_popcountll(bitset[idx]);
if (!bits)
{
i += 63;
continue;
}
// process
}
我正在寻找算法/技术而不是代码示例。但是如果你有代码要分享,我不会拒绝。任何学术研究论文也将不胜感激。
提前感谢!
分辨率是否总是在 1/2 和 1/64 之间?甚至 1/32?因为如果您需要很长的序列,则可能需要更多的循环嵌套,这可能会导致一些速度变慢。
您的序列总是很长(数百万位(还是这是最大值,但通常您的序列更短?当进行从高到低的分辨率时,您能否假设数据有效与否。
这里有一些技巧:
uint64_t one = 1;
uint64_t n_one_bits = (one << n) - 1u; // valid for 0 to 63; not sure for 64
如果您的序列很长,您可能需要检查n
是否是 2 的幂,并为这些情况提供更优化的代码。
您可能会在这里找到其他一些有用的技巧:
https://graphics.stanford.edu/~seander/bithacks.html
因此,如果您的分辨率是 1/16,则无需循环单个 16 位,但您可以一次检查所有 16 位。然后,您可以一次又一次地对下一组重复。
如果该数字不是 64 的分频器,则可以在每次越过 64 位边界时根据需要移动位。假设您的分辨率是 1/5,那么您可以处理 60 位,然后移动剩余的 4 位并与以下 60 位组合。
如果您可以假设数据是有效的,那么您甚至不需要移动原始数字,因为您每次都可以选择适当位的值。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- C/C++ 位数组分辨率转换算法
- 过载分辨率和用户定义的转换
- 模板转换运算符的分辨率不明确
- 将 X 坐标从一种分辨率转换为另一种分辨率
- 重载分辨率:是否首选直接转换运算符(由于复制省略)?
- 重载分辨率:调整 const/ref 是否不比用户定义的转换更好?
- 以上全高清分辨率的帧丢失.在MediaFoundation中有AVI解压缩器转换过滤器吗
- 函数重载和类型转换分辨率
- 具有多个函数和多个转换运算符的重载分辨率
- C++过载分辨率、转换运算符和常量
- 过载分辨率和用户定义的转换
- 将高分辨率时钟时间转换为整数(Chrono)