标签: bitset

将二进制文件读入位集或向量<bool>

如何将二进制文件读入bitsetor vector<bool>?二进制文件的长度会有所不同。有更好的容器吗?尽管我是一名经验丰富的程序员,但我还是 C++ 新手。

c++ binary bitset

5
推荐指数
1
解决办法
1758
查看次数

检查一个位集是否包含另一个位集的所有值

我正在尝试创建一个实体/组件系统,该系统自动匹配合适的实体合适的系统。我正在使用std::bitsetRTTI自动为每个组件类型分配一个位值。

系统的定义如下:MovementSystem : System<Position, Velocity>

MovementSystem,在本例中,接受同时具有PositionVelocity组件(以及任何其他组件)的任何实体。

为了检查实体是否合适,我将系统的位集与实体的位集进行比较。

// 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)) { …

c++ bit-manipulation bit bitwise-operators bitset

5
推荐指数
1
解决办法
2849
查看次数

在 Java 中使用 BitSet 跟踪前导零

因此,根据这个问题,有两种方法可以查看 a 的大小BitSet

  1. size(),这是遗留的,并不是很有用。我同意这一点。大小是64做后:

    BitSet b = new BitSet(8);

  2. length(),它返回最高设置位的索引。在上面的例子中,length()将返回0. 这有点有用,但不能准确反映在BitSet您有前导零的情况下应该表示的位数。

我很少(如果有的话)处理的信息平均分为 8 位字节,前导0s 对我来说和1s一样重要。我有一些 333 位长的数据字段,一些是 20 位等。

有没有更好的方法来处理 Java 中的位级细节来跟踪前导零?否则,我将不得不“自己动手”,可以这么说。对此我已经有了一些想法,但如果可能的话,我不想重新发明轮子。

java bitset

5
推荐指数
1
解决办法
758
查看次数

java中BitSet的Set操作的时间复杂度是多少?

我有一个场景,我必须将 BitSet 索引的范围设置为 1。所以如果我使用

   /*
    *Code snippet
    */
    BitSet myBitSet = new BitSet(100);
    myBitSet.set(10, 50);

    //**************************
Run Code Online (Sandbox Code Playgroud)

上面代码的时间复杂度是多少?它会遍历 40 个元素还是会执行某种位操作?

java bit time-complexity bitset

5
推荐指数
1
解决办法
2994
查看次数

BitSet valueOf 有什么作用?

我很难理解 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}.

java arrays bits bitset

5
推荐指数
2
解决办法
1216
查看次数

如何反转位集中的位?

例如,我有整数

一 = 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)

现在有一些简单的方法可以达到相同的效果。也许通过将我们的位集转换为字符串,然后将其反转?将 …

c++ bits bitset c++11

5
推荐指数
2
解决办法
7624
查看次数

将 BitSet 转换为 Byte[]

我有一个 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)

java arrays bitset

5
推荐指数
1
解决办法
993
查看次数

如何访问位集中的位范围?

我有一个非常大的位集,比如 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)

每次运行的最后一个数字似乎都发生了变化,这不是我所期望的。

c++ bitset std-bitset

5
推荐指数
1
解决办法
3465
查看次数

如何将数据插入 PostrgeSQL BIT VARYING 列

在我的 Spring Boot 应用程序中,我需要将位掩码存储到表列中,目的是对该列执行按位查询。

我有一个域类,其中包含一个 Long id 字段和一个包含位掩码的掩码字段。我无法弄清楚如何将它映射到包含自动生成的长“id”列和 BIT VARYING (100)“掩码”列的表。

我正在使用默认的 Hibernate 映射。当我在 Java 中将掩码定义为字符串时,出现“PSQLException:列“掩码”的类型位不同,但表达式的类型为字符不同”错误。

当我将掩码定义为 Java BitSet 时,PostgresSQL 仅针对 bytea Postgres 类型给了我一个类似的错误。

有没有办法将 Java 字段映射到 BIT VARYING 字段?可以使用默认持久性来完成吗?或者我是否必须覆盖 CRUD 方法才能在 BIT VARYING 和某些 Java 类型之间进行转换?

java postgresql hibernate bitset spring-data

5
推荐指数
0
解决办法
163
查看次数

从十进制转换的二进制中删除前导零

我正在解决一个问题,我必须将给定的前 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)

c++ string binary loops bitset

5
推荐指数
1
解决办法
1805
查看次数