如何将二进制文件读入bitsetor vector<bool>?二进制文件的长度会有所不同。有更好的容器吗?尽管我是一名经验丰富的程序员,但我还是 C++ 新手。
我正在尝试创建一个实体/组件系统,该系统自动匹配合适的实体合适的系统。我正在使用std::bitset和RTTI自动为每个组件类型分配一个位值。
系统的定义如下:MovementSystem : System<Position, Velocity>。
MovementSystem,在本例中,接受同时具有Position和Velocity组件(以及任何其他组件)的任何实体。
为了检查实体是否合适,我将系统的位集与实体的位集进行比较。
// Let's assume there are max 4 components
1 1 0 1 // Entity bitset
^ ^ ^
Position Velocity OtherB
1 1 0 0 // Suitable example system bitset
^ ^
Position Velocity
1 1 1 0 // Unsuitable example system bitset
^ ^ ^ // Entity does not have OtherA!
Position Velocity OtherA
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的解决方案是这样的:
if(entityBitset & systemBitset) == systemBitset)) { …
因此,根据这个问题,有两种方法可以查看 a 的大小BitSet。
size(),这是遗留的,并不是很有用。我同意这一点。大小是64做后:
BitSet b = new BitSet(8);
length(),它返回最高设置位的索引。在上面的例子中,length()将返回0. 这有点有用,但不能准确反映在BitSet您有前导零的情况下应该表示的位数。
我很少(如果有的话)处理的信息平均分为 8 位字节,前导0s 对我来说和1s一样重要。我有一些 333 位长的数据字段,一些是 20 位等。
有没有更好的方法来处理 Java 中的位级细节来跟踪前导零?否则,我将不得不“自己动手”,可以这么说。对此我已经有了一些想法,但如果可能的话,我不想重新发明轮子。
我有一个场景,我必须将 BitSet 索引的范围设置为 1。所以如果我使用
/*
*Code snippet
*/
BitSet myBitSet = new BitSet(100);
myBitSet.set(10, 50);
//**************************
Run Code Online (Sandbox Code Playgroud)
上面代码的时间复杂度是多少?它会遍历 40 个元素还是会执行某种位操作?
我很难理解 BitSet.valueOf(bytearray)
我有以下代码:
byte[] a = new byte[]{(byte) 0x2D, (byte) 0x04};
//binary => 0010 1101 0000 0100
BitSet bs = BitSet.valueOf(a);
System.out.println(bs);
Run Code Online (Sandbox Code Playgroud)
上面的代码给了我一个输出{0, 2, 3, 5, 10}。为什么?
我认为它应该返回为真或保持 1 的索引,向后应该是{2, 8, 10, 11, 13}.
例如,我有整数
一 = 10;
它的二进制表示(对于 32 位整数)是
00000000000000000000000000001010
反过来,它变成
01010000000000000000000000000000
现在我已经看到了这段代码,来自这篇topcoder article可以完成这个
x = ((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1);
x = ((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2);
x = ((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4);
x = ((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8);
x = ((x & 0xffff0000) >> 16) | ((x & 0x0000ffff) << 16);
Run Code Online (Sandbox Code Playgroud)
现在有一些简单的方法可以达到相同的效果。也许通过将我们的位集转换为字符串,然后将其反转?将 …
我有一个 BitSet,需要将其转换为 Byte[]。但是,通过使用 BitSet.toByteArray(),我没有得到正确的输出。我尝试将 Byte[] 转换为其二进制形式,以检查 Bitset 和 Byte[] 的二进制形式是否相似。
public static void generate() {
BitSet temp1 = new BitSet(64);
for (int i = 0; i < 64; i++) {
if(i % 8 != 0 && i < 23) {
temp1.set(i, true);
}
}
StringBuilder s = new StringBuilder();
for (int i = 0; i < 64; i++) {
s.append(temp1.get(i) == true ? 1 : 0);
}
System.out.println(s);
byte[] tempByteKey1 = temp1.toByteArray();
for (byte b : tempByteKey1) {
System.out.print(Integer.toBinaryString(b & …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的位集,比如 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++ ×5
java ×5
arrays ×2
binary ×2
bit ×2
bits ×2
c++11 ×1
hibernate ×1
loops ×1
postgresql ×1
spring-data ×1
std-bitset ×1
string ×1