实现<运算符的最优化方法是什么,以std::bitset对应无符号整数表示的比较(它应该适用于位集more than 64 bits)?
一个简单的实现将是:
template<std::size_t N>
bool operator<(const std::bitset<N>& x, const std::bitset<N>& y)
{
for (int i = N-1; i >= 0; i--) {
if (x[i] && !y[i]) return false;
if (!x[i] && y[i]) return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
当我说"最优化的方式"时,我正在寻找使用按位运算和元编程技巧(以及类似的东西)的实现.
编辑:我认为我找到了诀窍:模板元编程用于编译时递归和右位移,以便将位集比较为几个无符号长整数.但不明白如何做到这一点......
在我的程序中,我需要检查是否已经在一组2.5*10 ^ 9中生成了一个值.我希望生成大约一半的集合,并需要快速检查和更新它.在我看来,bitset是一个好主意,因为它不需要太多内存(每个值1位)并且速度很快.
问题是,当我在我的课程中定义我的设置时,我得到一个segmentation fault因为尺寸太大(它适用于较小的尺寸).
private:
std::bitset<2500000000UL> cover; // not working
std::bitset<25000UL> cover; // working
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
谢谢
PS:如果可能,我宁愿不使用外部库.我已经在使用GMP,但我不认为他们对大数字有一点设置.
我一直在使用Java中的Bitset类,我想在C中做类似的事情.我想我必须手动完成它作为C中的大多数东西.什么是有效的实现方法?
byte bitset[]
Run Code Online (Sandbox Code Playgroud)
也许
bool bitset[]
Run Code Online (Sandbox Code Playgroud)
?
我四处搜索,找不到bitset :: count()的性能时间规范.有人知道它是什么(O(n)或更好)以及在哪里找到它?
编辑按STL我只参考标准模板库.
我需要一个BitSet,它允许多个BitSet的轻松连接创建一个新的BitSet.该默认实现不具备这样的方法.
在某些外部库中是否有任何实现,任何人都知道哪个允许轻松连接?
例如,假设我有一个bitarray 11111和另一个位数组010101.我想要附加功能.因此连接后会产生11111010101.
我有一个std::bitset和bitset类型也提供了一个to_ulong方法来将bitset转换为数字,我的问题是关于将bitset转换为数字而只考虑该bitset中的一个范围,我需要实现我自己的powerof2函数或者有一些东西采用更标准的方法?
bitset<64>从以下构造a很容易uint64_t:
uint64_t flags = ...;
std::bitset<64> bs{flags};
Run Code Online (Sandbox Code Playgroud)
但是,有没有构建一个很好的方式bitset<64 * N>,从一个uint64_t[N],这样flags[0]会是指最低的64位?
uint64_t flags[3];
// ... some assignments
std::bitset<192> bs{flags}; // this very unhelpfully compiles
// yet is totally invalid
Run Code Online (Sandbox Code Playgroud)
或者我不得不set()在循环中打电话?
例
注意:我只关心信件.bitset 000001将是a或A.
我有一个string名字s的值"abc".我把每char一个string并通过使用转换为二进制值bitset.
例如
bitset <6> b1 = s[0]; //a
bitset <6> b2 = s[1]; //b
bitset <6> b3 = s[2]; //c
Run Code Online (Sandbox Code Playgroud)
然后我希望把结果放到一个array的strings.阵列的名称是arr(以及每个string的array将代表每一个的二进制值char)
例如
arr[0] //will hold the value of char 'a' in binary form which is 000001
arr[1] //will hold the value of char 'b' in binary form which is …Run Code Online (Sandbox Code Playgroud) 问题很简单(要问),与记忆std::bitset<32>是一回事uint32_t吗?或者更像是std::array<bool, 32>?
我经常这样做:
uint32_t index : 20;
uint32_t magic : 12;
Run Code Online (Sandbox Code Playgroud)
那么它和这段代码一样吗?
std::bitset<20> index;
std::bitset<12> magic;
Run Code Online (Sandbox Code Playgroud) 我想知道,如何有效地计算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 …