我在相当高吞吐量的设置中使用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的疯狂方法.

下面的函数需要两个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)
我对这段代码加速感兴趣吗?这个功能被称为十亿次,所以即使是微秒加速也是有道理的,而且我对最快的代码感到好奇.
我有一个提供给内核的输入数组。每个线程都使用数组的一个值,并且根据规则要么更改该值,要么根本不更改它。
我想很快地找出输入内存中是否有任何变化,如果有的话,我想很快地找到这个变化发生的地方(输入数组的索引)。
我想到使用类似位数组的东西。位的总数将等于线程的总数。每个线程只能操作一位,因此最初这些位将设置为 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)
有提供这个的图书馆吗?我想针对其他实现(包括我可能必须编写的实现)运行一些基准测试,但我找不到任何似乎实现此功能的基准。
我正在尝试将从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被交换,而不是我期望的典型的字节序交换,这正在颠倒所有字节的顺序).
当我使用时,
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?
我想创建一个存储 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 字符串呢?
(注意:不是谈论位图索引)
bitset ×10
c++ ×5
java ×3
bit ×2
bigint ×1
binary ×1
bitmap ×1
bmp ×1
c ×1
c++11 ×1
cardinality ×1
concurrency ×1
cuda ×1
endianness ×1
enumeration ×1
gpu ×1
intersection ×1
monochrome ×1
mysql ×1
rdbms ×1
scala ×1
sql ×1