标签: std-bitset

是否有类似于 std::bitset 的非拥有引用来为其他容器中的数据提供按位操作和计数?

我正在尝试为 ORB 功能实现 C++17 可移植且高效的汉明距离函数,希望在为 x86 和 ARM 编译时自动使用 SIMD。

有问题std::bitset

std::bitset<N>提供了按位运算和计数的标准方式,并且它也优于__builtin_popcount. cv::Mat然而,它是一种拥有数据的容器类型,并且不容易从由 计算的存储的 256 位向量转换而来cv::ORB::detectAndCompute

该线程要求转换cv::Matstd::bitset<256>. 我认为memcpy它的答案不正确,因为我没有std::bitsethttps://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
  • 按位异或运算和 popcount
  • 没有针对 ARM …

c++ simd bitwise-operators std-bitset c++17

4
推荐指数
1
解决办法
107
查看次数

如何将位集传递给函数?

我想将位集传递给函数。我应该为函数中的位集分配多少大小。

例如

void ABC(bitset<size> a){

}
Run Code Online (Sandbox Code Playgroud)

需要为传递给函数的参数分配多少大小?

c++ std-bitset

3
推荐指数
2
解决办法
5252
查看次数

传递 const 变量时编译器返回错误:模板参数不是常量表达式

所以我写了这段代码->

#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。我想知道为什么会发生这种情况,因为大小已被声明为常量,并且它的值在程序运行时不会改变?

c++ constants bitset std-bitset

3
推荐指数
1
解决办法
867
查看次数

2
推荐指数
1
解决办法
3126
查看次数

我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset

我正在使用 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 呢?我的代码检查整个数组并在某一时刻停止。

c++ windows std-bitset

2
推荐指数
1
解决办法
289
查看次数

是否希望在不久的将来将 std::bitset&lt;128&gt; 转换为单个 128 位整数?

我使用 std::bitset 来表示短 DNA 序列(单倍型)。出于我的目的,我需要能够将每个这样的序列转换为单个整数。目前,由于 std::bitset::to_ullong 的工作方式,此要求似乎将我的序列长度限制为 <=64?

由于 C++ 有多种表示 128 位整数的方法(C++ 中有 128 位整数吗?),我想知道 std::bitset 支持直接转换为 128 位整数需要多长时间?

当然,如果我知道我错了并且人们已经可以做到这一点,我会非常高兴......

谢谢!

c++ int128 unsigned-long-long-int std-bitset

2
推荐指数
1
解决办法
727
查看次数

C ++位集参考

关于位集参考的两个问题:

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)

c++ c++11 std-bitset

0
推荐指数
1
解决办法
70
查看次数