如何将二进制文件读入bitsetor vector<bool>?二进制文件的长度会有所不同。有更好的容器吗?尽管我是一名经验丰富的程序员,但我还是 C++ 新手。
我有一个提供给内核的输入数组。每个线程都使用数组的一个值,并且根据规则要么更改该值,要么根本不更改它。
我想很快地找出输入内存中是否有任何变化,如果有的话,我想很快地找到这个变化发生的地方(输入数组的索引)。
我想到使用类似位数组的东西。位的总数将等于线程的总数。每个线程只能操作一位,因此最初这些位将设置为 false,如果线程更改相应的输入值,则该位将变为 true。
为了使它更清楚,我们假设我们有这个输入数组称为A
1 9 3 9 4 5
Run Code Online (Sandbox Code Playgroud)
位数组如下
0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
因此我们将有 6 个线程处理输入数组。假设最终的输入数组是
1 9 3 9 2 5
Run Code Online (Sandbox Code Playgroud)
所以最终的位数组将是:
0 0 0 0 1 0
Run Code Online (Sandbox Code Playgroud)
我不想使用数组,bool因为每个值都会占用 1 个字节的内存,这相当多,因为我只想使用位来工作。
有可能实现这样的目标吗?
我想创建一个char数组,其中数组的每个值都有 8 位。但是,如果两个线程想要更改数组第一个字符的不同位怎么办?即使位内的更改将位于不同的位置,他们也必须以原子方式执行操作。因此,使用原子操作可能会破坏并行性,在这种情况下,不需要使用原子操作,它没有任何意义,但必须使用,因为使用字符数组而不是更专门的东西的限制像一个std::bitset
先感谢您。
我正在寻找一个 C++ 位集实现,它可以回答是否在一个范围内设置了一个位。 std::bitset、vector和boost::dynamic_bitset都可以访问我可以循环的各个位,但这不是查询一系列位以询问是否设置了任何位的最有效方法 - 我不这样做甚至不需要知道是哪一个。
bitset b;
if(b.any(33, 199))
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
有提供这个的图书馆吗?我想针对其他实现(包括我可能必须编写的实现)运行一些基准测试,但我找不到任何似乎实现此功能的基准。
当我使用时,
std::bitset<5> op1 (std::string("01001"));
std::bitset<5> op2 (std::string("10011"));
std::cout << (op1|=op2) << std::endl;
Run Code Online (Sandbox Code Playgroud)
显然一切都很好。
但我的问题是,如何使用两个不同大小的“std::bitset”进行 OR 运算?例如,
std::bitset<11> op1 (std::string("101110011"));
std::bitset<5> op2 (std::string("01001"));
std::cout << (op1|=op2) << std::endl;
Run Code Online (Sandbox Code Playgroud)
我无法在 VS 2012 中编译此代码。我在这里错过了什么?我不能使用不同大小的位集进行“或”运算(以及“异或”运算)吗?这是平台特定的问题吗?
我可能需要一些帮助来弄清楚如何喂养下面的过程。我需要编写一个单色 BMP 文件。下面的代码(来自:How to Save monochrome Image as bmp in windows C++ ?)看起来能够做到这一点。我现在陷入了如何将 astd::bitset或 最好转换boost::dynamic_bitset成这种byte*格式的困境。到目前为止我的所有尝试都失败了,我无法将 8x8 棋盘格图案之类的东西写入 BMP 中。该程序创建了BMP,并且可以被Photoshop读取,但内容很乱。因此,任何如何解决此问题的建议都将受到赞赏!
Save1BppImage(byte* ImageData, const char* filename, long w, long h){
int bitmap_dx = w; // Width of image
int bitmap_dy = h; // Height of Image
// create file
std::ofstream file(filename, std::ios::binary | std::ios::trunc);
if(!file) return;
// save bitmap file headers
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER * infoHeader;
infoHeader = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER) );
RGBQUAD bl = …Run Code Online (Sandbox Code Playgroud) 在Java 8下面的代码中,将整数转换3为位集并打印{0, 1},这意味着 的位表示3在位置上有 1 0,1即11。
System.out.println(BitSet.valueOf(new long[]{3}));
Run Code Online (Sandbox Code Playgroud)
我有兴趣将具有大值的BigIntegeror转换为相应的值,然后再返回 - 让对象(位表示)将其转换为( )。我还想知道对于各种整数值,哪种表示形式占用更多内存?long10000000BitSetBitSetBigIntegerlong
我想知道如果我们对一条口号甚至 64 位字长进行操作,我可以同时对位集中的各个位进行操作吗?假设我有 10 个线程,每个线程都有threadId. 所有线程可以同时设置吗bits[threadId] = value?
我有一个非常大的位集,比如 100 亿位。
我想做的是将其写入文件。但是使用.to_string()实际上冻结了我的计算机。
我想做的是迭代这些位并一次取 64 位,将其转换为 auint64然后将其写入文件。
但是我不知道如何访问位集的不同范围。我该怎么做?我是 C++ 的新手,不确定如何访问底层的 bitset::reference,所以请提供一个答案的例子。
我尝试使用指针,但没有得到我期望的结果。这是我目前正在尝试的一个例子。
#include <iostream>
#include <bitset>
#include <cstring>
using namespace std;
int main()
{
bitset<50> bit_array(302332342342342323);
cout<<bit_array << "\n";
bitset<50>* p;
p = &bit_array;
p++;
int some_int;
memcpy(&some_int, p , 2);
cout << &bit_array << "\n";
cout << &p << "\n";
cout << some_int << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出
10000110011010100111011101011011010101011010110011
0x7ffe8aa2b090
0x7ffe8aa2b098
17736
Run Code Online (Sandbox Code Playgroud)
每次运行的最后一个数字似乎都发生了变化,这不是我所期望的。
在我的 Spring Boot 应用程序中,我需要将位掩码存储到表列中,目的是对该列执行按位查询。
我有一个域类,其中包含一个 Long id 字段和一个包含位掩码的掩码字段。我无法弄清楚如何将它映射到包含自动生成的长“id”列和 BIT VARYING (100)“掩码”列的表。
我正在使用默认的 Hibernate 映射。当我在 Java 中将掩码定义为字符串时,出现“PSQLException:列“掩码”的类型位不同,但表达式的类型为字符不同”错误。
当我将掩码定义为 Java BitSet 时,PostgresSQL 仅针对 bytea Postgres 类型给了我一个类似的错误。
有没有办法将 Java 字段映射到 BIT VARYING 字段?可以使用默认持久性来完成吗?或者我是否必须覆盖 CRUD 方法才能在 BIT VARYING 和某些 Java 类型之间进行转换?
我正在解决一个问题,我必须将给定的前 N 个自然数转换为二进制数。我正在使用bitset和.to_string()。但是,在数字转换为二进制后,它有一些前导零显然等于给定位集的大小。任务是删除它。我已经做到了,std::string:: erase()但我认为这样做不是一个好方法。如何优化这部分代码?
#include <iostream>
#include <bitset>
#include <string>
int main()
{
int T;
std:: cin >> T;
while(T--) {
int n;
std:: cin >> n;
for(auto i = 1; i <= n; ++i) {
std::string binary = std::bitset<32>(i).to_string(); //to binary
//This part here
int j = 0;
while(binary[j] == '0') {
++j;
}
binary.erase(0, j);
//Till here
std::cout<<binary<<" ";
}
std:: cout << std:: endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) bitset ×10
c++ ×7
binary ×3
bit ×2
java ×2
bigint ×1
bitmap ×1
bmp ×1
c++11 ×1
concurrency ×1
cuda ×1
gpu ×1
hibernate ×1
loops ×1
monochrome ×1
postgresql ×1
spring-data ×1
std-bitset ×1
string ×1