我需要一个BitSet,它允许多个BitSet的轻松连接创建一个新的BitSet.该默认实现不具备这样的方法.
在某些外部库中是否有任何实现,任何人都知道哪个允许轻松连接?
例如,假设我有一个bitarray 11111和另一个位数组010101.我想要附加功能.因此连接后会产生11111010101.
标准库类模板std::bitset<N>有一个构造函数(C++ 11及更高版本,unsigned longC++ 11之前的参数)
constexpr bitset(unsigned long long) noexcept
Run Code Online (Sandbox Code Playgroud)
与许多最佳实践指南相反,此单参数构造函数未标记为explicit.这背后的理由是什么?
c++ explicit-constructor unsigned-long-long-int bitset implicit-conversion
我想知道,如何有效地计算hashCode类似BitSet的实现Set<Integer>.
该BitSet#hashCode显然是快速地计算,而愚蠢的(*)和不兼容的Set#hashCode().
快速兼容的实现可能会像
int hashCode() {
int result = 0;
for (int i=0; i<bits.length; ++i) {
long word = bits[i];
result += 64 * i * Long.bitCount(word) + weightedBitCount(word);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果有一个有效的实施
int weightedBitCount(long word) { // naive implementation
int result = 0;
for (int i=0; i<64; ++i) {
if ((word & (1L << i)) != 0) {
result += i;
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果未设置大多数位,可以通过测试word==0 …
连接2个位集的最佳方法是什么?
比如我有
boost::dynamic_bitset<> test1( std::string("1111") );
boost::dynamic_bitset<> test2( std::string("00") );
Run Code Online (Sandbox Code Playgroud)
它们应该连接成一个thrid Bitset test3然后保存
111100
Run Code Online (Sandbox Code Playgroud)
解决方案应该使用boost :: dynamic_bitset.如果解决方案适用于std :: bitset,那也会很好.在连接位时应该关注性能.
更新:我比较了两种方法(来自我和Neil的字体方法以及来自信使的shift方法)和字符串方法更快(因子10 ++).代码在这里:http: //pastebin.com/HfpfYfy8
我希望Pastebin可以发布长代码清单.如果有更好的方法请与我联系.
C++是否会对位排序做出任何说明?我特别致力于协议数据包布局,我怀疑是否有一种可移植的方式来指定将某个数字写入第5,6,7位,其中第5位是"最重要的".
我的问题:
bitset<8>().set(7).to_ulong()始终等于1?我需要从bitset中取出字节,这可能(不)包含多个CHAR_BIT位.我现在需要将多少位中的位放入数组中.例如,
位集声明为 std::bitset < 40> id;
有一个单独的变量可以使用nBits多少位id.现在我想以CHAR_BIT的倍数提取这些位.我还需要处理案件nBits % CHAR_BIT != 0.我可以将它放入uint8数组中
当我使用std::bitset<N>::bitset( unsigned long long )这个构造一个bitset时,当我通过它访问它时operator[],这些位似乎是以little-endian方式排序的.例:
std::bitset<4> b(3ULL);
std::cout << b[0] << b[1] << b[2] << b[3];
Run Code Online (Sandbox Code Playgroud)
打印1100而不是0011结尾(或LSB)位于小(低)地址,索引0.
它说,查找标准
将前M位位置初始化为相应的位值
val
程序员自然会想到从LSB到MSB的二进制数字(从右到左).所以前M位的位置可以理解为LSB→MSB,因此位0将为b[0].
然而,在转变中,定义是如此
E1<< 的值E2是E1左移位E2位置; 空位是零填充的.
这里必须解释E1从MSB→LSB开始的位,然后是左移E2时间.如果它是从LSB→MSB写的,那么只有右移E2时间会产生相同的结果.
我很惊讶在C++的其他地方,语言似乎投射出自然(英语;从左到右)的写作顺序(当进行诸如移位之类的按位操作时).为什么在这里不一样?
考虑这个单元测试:
std::bitset<8> temp( "11010100" );
reverseBitSet( temp );
CPPUNIT_ASSERT( temp == std::bitset<8>( "00101011" ) );
Run Code Online (Sandbox Code Playgroud)
此实现有效:
template<size_t _Count> static inline void reverseBitSet( std::bitset<_Count>& bitset )
{
bool val;
for ( size_t pos = 0; pos < _Count/2; ++pos )
{
val = bitset[pos];
bitset[pos] = bitset[_Count-pos-1];
bitset[_Count-pos-1] = val;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这个没有:
template<size_t _Count> static inline void reverseBitSet( std::bitset<_Count>& bitset )
{
for ( size_t pos = 0; pos < _Count/2; ++pos )
{
std::swap( bitset[pos], bitset[_Count-pos-1] );
}
} …Run Code Online (Sandbox Code Playgroud) 对于乘法大二进制矩阵(10Kx20K),我通常要做的是将矩阵转换为浮点数并执行浮点矩阵乘法,因为整数矩阵乘法非常慢(请看这里).
但这一次,我需要执行超过数十万次这样的乘法运算,甚至平均事情上的毫秒级性能提升.
我想要一个int或float矩阵作为结果,因为产品可能有非0或1的元素.输入矩阵元素都是0或1,因此它们可以存储为单个位.
在行向量和列向量之间的内积中(为了产生输出矩阵的一个元素),乘法简化为按位AND.添加仍然是添加,但我们可以添加具有填充计数功能的位,而不是单独循环它们.
一些其他布尔/二进制矩阵函数或位而不是计数它们,产生位矩阵结果,但这不是我需要的.
下面是一个示例代码,显示将问题形成为std::bitset, AND并且count操作比矩阵乘法更快.
#include <iostream>
using std::cout; using std::endl;
#include <vector>
using std::vector;
#include <chrono>
#include <Eigen/Dense>
using Eigen::Map; using Eigen::Matrix; using Eigen::MatrixXf;
#include <random>
using std::random_device; using std::mt19937; using std::uniform_int_distribution;
#include <bitset>
using std::bitset;
using std::floor;
const int NROW = 1000;
const int NCOL = 20000;
const float DENSITY = 0.4;
const float DENOMINATOR = 10.0 - (10*DENSITY);
void fill_random(vector<float>& vec) { …Run Code Online (Sandbox Code Playgroud) 我有一个问题,我有点困惑,一位同事告诉我,这将是一个寻求帮助的好地方.
我试图在Java中实现C风格的位域.这是一个粗略的例子(此时我没有在我面前的实际代码).
typedef union
{
typedef struct
{
unsigned short a :1;
unsigned short b :1;
unsigned short c :2;
unsigned short d :10;
} bitfield;
unsigned short bitmap;
}example_bitfield;
Run Code Online (Sandbox Code Playgroud)
遗留代码中我有一些类似的样式位域.我需要为Java提供等效方法的原因是我正在研究将使用Java与使用UDP的其他遗留应用程序进行通信的代码.
我没有重写代码的选项.我知道这种方法不可移植,有字节序问题(和填充/对齐等),如果我能够重写代码,可以做得更好.不幸的是,我需要回答这个非常具体的问题.系统已关闭,因此我不需要担心编译器/操作系统等每一种可能的组合.
使用Java EnumSet的方法不起作用,因为我认为只允许每个值为一位.我需要能够打包值,例如占用10位的d值.
我知道Java Bitset但它有局限性.我使用的是旧版本的Java,因此我没有一些较新的Java Bitset方法(即可能肯定有帮助的valueOf方法).
有没有人有任何关于如何使这个尽可能易于管理的想法?我有超过10个位域需要为我的通信实现.
感谢您提供任何帮助!