我正在尝试为 ORB 功能实现 C++17 可移植且高效的汉明距离函数,希望在为 x86 和 ARM 编译时自动使用 SIMD。
std::bitsetstd::bitset<N>提供了按位运算和计数的标准方式,并且它也优于__builtin_popcount. cv::Mat然而,它是一种拥有数据的容器类型,并且不容易从由 计算的存储的 256 位向量转换而来cv::ORB::detectAndCompute。
该线程要求转换cv::Mat为std::bitset<256>. 我认为memcpy它的答案不正确,因为我没有std::bitset在https://en.cppreference.com/w/cpp/utility/bitset中找到内存布局。此外,std::bitset构造函数不支持初始化超过位sizeof(unsigned long long)。
为了避免复制,我当前的实现使用类似 span 的类:
struct ORB_view {
inline static constexpr int length = 256 / sizeof(uint32_t) / 8;
const uint32_t* data;
};
Run Code Online (Sandbox Code Playgroud)
但是,这不能直接使用按位运算和 popcount,并且会导致在实现中出现显式的 SIMD 指令,我希望通过使用std::bitset<N>::count().
因此,在这种情况下,提供按位运算和计数的非拥有引用将非常有帮助。所需的功能是:
std::bitset我想将位集传递给函数。我应该为函数中的位集分配多少大小。
例如
void ABC(bitset<size> a){
}
Run Code Online (Sandbox Code Playgroud)
需要为传递给函数的参数分配多少大小?
所以我写了这段代码->
#include <iostream>
#include <bitset>
int main(){
int num, temp, digits = 0;
std::cin >> num;
temp = num;
while(temp){
temp /= 10;
++digits;
}
const int size = digits;
std::bitset<size> a(num);
std::cout << a << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
位集容器不接受 const 整数大小作为参数并抛出错误 - Non-type template argument is not a constant expression。我想知道为什么会发生这种情况,因为大小已被声明为常量,并且它的值在程序运行时不会改变?
我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset 。结果,程序只占用了我的 298 MB RAM,但必须填充 ~24 GB。我有 32 GB RAM,现在 26 GB 是免费的。当我为 x86 构建代码时,它会编译并可以启动,但对于 x64,它会显示以下内容:错误 C2148:数组的总大小不得超过 0x7fffffff 字节。如何修复它并且不减少位集数组的大小?
我尝试制作两个全局数组。另外,我已在 Microsoft Visual Studio -> 项目 -> name_project 属性 -> 配置属性 -> 链接器 -> 系统 -> 堆栈保留大小中设置为 25,000,000 (我认为必须有 KB,所以我认为我已设置为〜 25 GB)。
... // other libraries
#include <bitset>
std::bitset <100000000000>mas;
std::bitset <100000000000>a1;
int main() {.../* work with the arrays */...}
Run Code Online (Sandbox Code Playgroud)
我想使用巨大的 std::bitset 数组运行代码。
UPD:对于 x86 可以,但是对于 x64 呢?我的代码检查整个数组并在某一时刻停止。
我使用 std::bitset 来表示短 DNA 序列(单倍型)。出于我的目的,我需要能够将每个这样的序列转换为单个整数。目前,由于 std::bitset::to_ullong 的工作方式,此要求似乎将我的序列长度限制为 <=64?
由于 C++ 有多种表示 128 位整数的方法(C++ 中有 128 位整数吗?),我想知道 std::bitset 支持直接转换为 128 位整数需要多长时间?
当然,如果我知道我错了并且人们已经可以做到这一点,我会非常高兴......
谢谢!
关于位集参考的两个问题:
Q1。有什么方法可以返回类私有成员位集?在下面的代码片段中(接着输出),我尝试使用常规引用,但它甚至都不会修改Foo类中的bitset成员。
Q2。从这个问题的答案中,我了解到常规引用没有足够的粒度指向存储的单个位,bitset因为bitset它们以更紧凑的形式存储。但是,如果这是真的,我的代码又如何能够修改该行中b3的第一位b3[1] = 0?
#include <iostream>
#include <bitset>
using namespace std;
class Foo
{
private:
bitset<4> b1;
public:
inline void print_value()
{
cout << "The bitset b1 is: ( "<< b1 << " )" << endl;
}
inline void set_all() { b1.set(); }
inline bitset<4> get_b1() { return b1; }
inline bitset<4>& get_b1_ref() { return b1; }
};
int main()
{
Foo f;
f.print_value();
f.set_all();
f.print_value();
auto b2 = f.get_b1();
b2.flip(); …Run Code Online (Sandbox Code Playgroud)