最小大小的实现bool数组
Minimum size implementation for bool array
我需要一个最小大小的bool数组实现。数组的大小在编译时已知。
我检查了std::bitset
和boost::array
,但是它们都会产生开销,这对于小数组来说是很重要的。例如,如果数组大小为8,则容器应该只使用1字节的内存(假设采用通用CPU架构)。
这个存在吗?还是我需要自己滚动?
您可以自己制作,但不能从头开始。bitset
实现应该有几行看起来像typedef unsigned long _WordT;
(SGI)或typedef _Uint32t _Ty;
(MSVS)。您可以小心地替换类型和名称空间,并以这种方式创建自己的容器。我将类型更改为char和sizeof
返回1 (vs2010对pastebin的概念验证)
下面是一个简单的例子。请注意,它只做它需要做的事情,所以你不能像std::bitset
一样迭代它。
#include <climits>
#include <iostream>
#include <cassert>
template<int S> struct boolset {
static int const SIZE = ((S / CHAR_BIT) + (0 != (S % CHAR_BIT)));
unsigned char m_bits[SIZE];
public:
boolset() : m_bits() { for(int i = 0; i < SIZE; ++i) m_bits[i] = 0; }
bool get(int i) const {
assert(i < S);
return (m_bits[i / CHAR_BIT] & (1 << (i % CHAR_BIT)));
}
void set(int i, bool v) {
assert(i < S);
if(v) { m_bits[i / CHAR_BIT] |= (1 << (i % CHAR_BIT)); }
else { m_bits[i / CHAR_BIT] &= ~(1 << (i % CHAR_BIT)); }
}
void print(std::ostream & s) const {
for(int i = 0; i < S; ++i) {
s << get(i);
}
}
};
int main(int argc, char ** argv) {
std::cout << sizeof(boolset<1>) << std::endl;
std::cout << sizeof(boolset<8>) << std::endl;
std::cout << sizeof(boolset<9>) << std::endl;
std::cout << sizeof(boolset<16>) << std::endl;
std::cout << sizeof(boolset<17>) << std::endl;
std::cout << sizeof(boolset<32>) << std::endl;
std::cout << sizeof(boolset<33>) << std::endl;
std::cout << sizeof(boolset<64>) << std::endl;
std::cout << sizeof(boolset<129>) << std::endl;
std::cout << std::endl;
boolset<31> bs;
bs.set(0, true);
bs.set(28, true);
bs.set(2, true);
std::cout << bs.get(28) << std::endl;
bs.print(std::cout); std::cout << std::endl;
bs.set(2, false);
bs.print(std::cout); std::cout << std::endl;
}
ideone的输出
template <int N>
class BitSet {
enum { BPC = 8 }; // Bits per char, #ifdef as needed
char m_bits[ (N + (BPC-1)) / BPC ];
public:
void SetBit( int i ) { m_bits[ i / BPC ] |= 1 << (i % BPC); }
void ClearBit( int i ) { m_bits[ i / BPC ] &= ~(1 << (i % BPC)); }
int GetBit( int i ) { return (m_bits[ i / BPC ] >> (i % BPC)) & 1; }
};
也许如果你这样做:
#include<vector>
#include <iostream>
template<int N>
struct array
{
char bits : N;
int getNthbit(int bitnr)
{
// important to make sure bitnr is not larger than the size of the type of `bits` in number of `CHAR_BITS`
return bits & (1 << bitnr);
}
};
//Specialize for N > 8
int main()
{
std::cout << sizeof(array<8>);
}
如果您查看Live示例,您将看到当N == 8
为sizeof(array<8>)
返回1
时。
当你输入32,它返回4。
你唯一需要做的就是专门化N > 8
的模板,这样类型就会改变,以适应比特的数量。
我不是模板天才,也许有人关心写一个例子?
免责声明:我从OPs问题中提取了这个答案。答案不应包含在问题本身中。
Gabriel Schreiber的回答:
这是我基于Tom Knapen的帖子的最终实现。我为构造函数添加了一个默认值,并在索引越界的情况下添加了抛出。非常感谢汤姆和其他人。
#include <stdexcept>
#include <climits>
/// Minimum size container for bool-arrays
/**
* TODO: may want to add to_uint32_t accessor and the like
* for sufficently small arrays
*/
template<int SIZE>
class bitarray
{
public:
bitarray(bool initial_value = false);
bool get(int index) const;
void set(int index, bool value);
private:
static const int ARRAY_SIZE = (SIZE + CHAR_BIT - 1) / 8;
unsigned char mBits[ARRAY_SIZE];
};
// ----------------------------------------------------
// Definitions
// ----------------------------------------------------
template<int SIZE>
inline bitarray<SIZE>::bitarray(bool initial_value)
{
for(int i = 0; i < ARRAY_SIZE; ++i)
mBits[i] = initial_value ? -1 : 0;
}
template<int SIZE>
inline bool bitarray<SIZE>::get(int index) const
{
if (index >= SIZE)
throw std::out_of_range("index out of range");
return (mBits[index / CHAR_BIT] & (1 << (index % CHAR_BIT)));
}
template<int SIZE>
inline void bitarray<SIZE>::set(int index, bool value)
{
if (index >= SIZE)
throw std::out_of_range("index out of range");
if (value)
mBits[index / CHAR_BIT] |= (1 << (index % CHAR_BIT));
else
mBits[index / CHAR_BIT] &= ~(1 << (index % CHAR_BIT));
}
相关文章:
- 错误:数组下标的类型"const bool[int]"无效
- 我无法将'2D array whit bool'转换为"空 2D 数组布尔值"(用于生命游戏)
- C++ bool 数组返回 1 或 0 以外的值
- Bool Vector 2D数组在IF条件下使用
- 是否有一种替换C风格的Bool数组的标准方法
- 是否正确删除了 *bool 数组C++
- 将bool数组传递给函数
- SelectionSort with bool-数组的第一个值显示为整个选项卡
- 最有效的方式插入一行bool值到原始数组
- 在c++中声明一个大小为n的bool数组,保证每个arr[n]都为0
- 如何创建一个大小为40000的c++ bool 2D数组
- 在c++中显示bool数组为黑白屏幕
- 将 stl 向量<bool>转换为布尔 * 数组的快速方法
- 最小大小的实现bool数组
- 将Bool数组从c#传递给c++代码
- c++中的Bool数组问题
- 如何在数组<bool>上使用位操作
- 返回bool值的函数数组
- c++中添加两个bool数组
- 将一个bool /int数组传递给函数,该函数应该对其进行修改