标签: bitset

Scala Enumeration ValueSet.isEmpty很慢

我在相当高吞吐量的设置中使用Scala Enumeration ValueSet - 创建,测试,联合和交叉约10M /秒/核心.我没想到这会是一个大问题,因为我曾经读过他们得到BitSets支持的地方,但令人惊讶的是,ValueSet.isEmpty在与YourKit的分析会话中出现了热点.

为了验证,我决定尝试使用Java BitSet重新实现我需要的东西,同时尝试保留使用Scala Enumerations的一些类型安全性.(代码审查转移到https://codereview.stackexchange.com/questions/74795/scala-bitset-implemented-with-java-bitset-for-use-in-scala-enumerations-to-repl)好消息是,将我的ValueSets更改为这些BitSet确实减少了25%的运行时间,因此我不知道ValueSet在引擎盖下的确做了什么,但它可以改进......

编辑:查看ValueSet源似乎表明isEmpty肯定是O(N),使用通用SetLike.isEmpty实现. 考虑到ValueSet是用BitSet实现的,这是一个错误吗?

编辑:这是分析器的回溯.这似乎是一种在bitset上实现isEmpty的疯狂方法.

在YourKit中回溯热点

java enumeration scala bitset scala-collections

6
推荐指数
1
解决办法
254
查看次数

Java获取BitSet交集基数的最快方法

下面的函数需要两个BitSets,复制第一个(它不能被覆盖),将副本与第二个(按位AND)相交并返回结果的基数.

public int getIntersectionSize(BitSet bits1, BitSet bits2) {
    BitSet copy = (BitSet) bits1.clone();
    copy.and(bits2);
    return copy.cardinality();
}
Run Code Online (Sandbox Code Playgroud)

我对这段代码加速感兴趣吗?这个功能被称为十亿次,所以即使是微秒加速也是有道理的,而且我对最快的代码感到好奇.

java intersection cardinality bitset

6
推荐指数
1
解决办法
1108
查看次数

在 CUDA 中模拟 std::bitset

我有一个提供给内核的输入数组。每个线程都使用数组的一个值,并且根据规则要么更改该值,要么根本不更改它。

我想很快地找出输入内存中是否有任何变化,如果有的话,我想很快地找到这个变化发生的地方(输入数组的索引)。

我想到使用类似位数组的东西。位的总数将等于线程的总数。每个线程只能操作一位,因此最初这些位将设置为 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

先感谢您。

cuda gpu bit bitset

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

如何查询 C++ std::bitset 中是否设置了某个范围内的任何位?

我正在寻找一个 C++ 位集实现,它可以回答是否在一个范围内设置了一个位。 std::bitsetvectorboost::dynamic_bitset都可以访问我可以循环的各个位,但这不是查询一系列位以询问是否设置了任何位的最有效方法 - 我不这样做甚至不需要知道是哪一个。

bitset b;
if(b.any(33, 199))
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

有提供这个的图书馆吗?我想针对其他实现(包括我可能必须编写的实现)运行一些基准测试,但我找不到任何似乎实现此功能的基准。

c++ bitset

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

字节顺序转换C++

我正在尝试将从big-endian机器发送的一些数据解码到解码器,解码器位于little-endian机器上.我没有这么做过,我觉得自己很困惑.

我使用位集来打印我的数据,这样我就可以确切地看到它是如何出现在特定的32位结构中的,我可以看到我需要的数据位于位序列的中间.

现在,我知道如果你有一个32位的值,从大到小,你可以反转字节顺序.如果我这样做,我的数字并没有达到我预期的数字(手工完成).

所以,例如.我有一个32位的unsigned int.我知道它来自我的Big-Endian机器为0x50000000.当我使用little-endian机器上的bitset打印时,cout << "packSpare 32: " << bitset<32>(Data.pack_Spare).to_string() << endl; 我得到0x00005000.所以它看起来更像是按顺序交换前两个字节,依次与后两个字节交换.

我原来有这样的结构:

#pragma pack(push, 1)
    struct PACK_SPARE
    {
        int         Spare3:28;
        int         Heading_Reference:1;
        int         Spare2:1;
        int         H_Valid:1;
        int         Spare5:1;
    };
    #pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

这是与大端机器发送方式相反的顺序,但是我注意到了一些明显的位交换发生的问题,所以我想把整个东西拉成32位,然后交换,然后打印出来数据.现在我正在使用int pack_Spare;

它只是采用两个16位块,并交换那些,而不是在整个32位值上进行交换?对不起,如果这没有意义,就像我说的那样,我有点困惑.

编辑 此数据不是通过网络传输的.我正在从视频文件中流式传输比特.我将此数据存储到其相应的值中.所以我想我的问题是,如果我有一个32位的int,然后将数据传入该变量,如果我使用bitset,为什么它交换我的32位int的两个16位分组,而不是按字节进行?我期待0x50000000,但我得到0x00005000(0000和5000被交换,而不是我期望的典型的字节序交换,这正在颠倒所有字节的顺序).

c c++ endianness bitset

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

如何获取具有不同位集大小的位集 OR

当我使用时,

  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 中编译此代码。我在这里错过了什么?我不能使用不同大小的位集进行“或”运算(以及“异或”运算)吗?这是平台特定的问题吗?

c++ binary bit bitset

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

从位集创建单色 BMP

我可能需要一些帮助来弄清楚如何喂养下面的过程。我需要编写一个单色 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)

c++ monochrome bitmap bmp bitset

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

Java 从 BigInteger 到 BitSet 并返回

Java 8下面的代码中,将整数转换3为位集并打印{0, 1},这意味着 的位表示3在位置上有 1 0111

System.out.println(BitSet.valueOf(new long[]{3}));
Run Code Online (Sandbox Code Playgroud)

我有兴趣将具有大值的BigIntegeror转换为相应的值,然后再返回 - 让对象(位表示)将其转换为( )。我还想知道对于各种整数值,哪种表示形式占用更多内存?long10000000BitSetBitSetBigIntegerlong

java bitset bigint

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

对于每个单独的线程一次写入的位集单独位线程是否安全?

我想知道如果我们对一条口号甚至 64 位字长进行操作,我可以同时对位集中的各个位进行操作吗?假设我有 10 个线程,每个线程都有threadId. 所有线程可以同时设置吗bits[threadId] = value

c++ concurrency bitset c++11

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

如何使用 MySQL 存储和改变位图/位集?

我想创建一个存储 500 字节位图 ( 500 bytes * 8 bits per byte = 4000 bits) 的表列,并执行操作以改变位图中某些索引处的位(设置为 1 或 0)。

然而,有关位图的文档页面大多是空的,我只能将原始位函数作为唯一的指南。如何在 MySQL 中创建、计数、读取和更改位图作为列类型?

使用binandlpad可以将 64 位数字作为二进制字符串打印出来。

LPAD(BIN(34), 64, '0')
0000000000000000000000000000000000000000000000000000000000100010
Run Code Online (Sandbox Code Playgroud)

然而,如何打印出可能有 4000 位长的 binary/blob/varbinary 字符串呢?

(注意:不是谈论位图索引)

mysql sql rdbms bit-manipulation bitset

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