BitSet 原理&位操作&基本类型的大小

因为在看编程珠玑 第一章讲到了 用BitSet来对N多数字进行排序

java中无疑提供了 bitSet 看了看源码 又找了找文章 了解了一些,此外暴漏了自己的基础知识不牢靠  对基本类型byte int long的认识不足 以及对位操作的差劲!!!!

 

BitSet 

java.util 包下面, jdk实现是通过 long数组来存储的

 

private long[] words;
 

因此最小的BitSet也有64位,如果感觉浪费 可以考虑自己实现一个BitSet。此外,BitSet可以自己增长,但是注意的是BitSet都是64的倍数。 size() 方法返回的也是64的倍数。

 

 

个人感觉BitSet 的应用场合是 对空间要求比较的严格,并且数字很多,而且数字各异,BitSet提供了很多方法,例如 与,或等位操作。

 http://www.cnitblog.com/weiweibbs/archive/2008/09/11/49009.html

 

此外应该会进行BitSet的操作

void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK)); }

 

void clr(int i) { a[i>>SHIFT] &=~(1<<(i & MASK)); }

 

int test(int i) { return a[a>>SHIFT] & (i & MASK); }

 

这几个方法是 《编程珠玑》上的 表示方法 其实 对于long数组来说 SHIFT应该是6

MASK 0xffffffffffffffffL

 

对应java.util.BitSet来说 应该是 set(int) clear(int) get(int)不过这个get方法返回的是boolean

 

---------------------------------------------------------------------------------------------------------

此外, byte   short   int    long 。 byte 8位: -128----127;short 16位: -pow(2,16) ---  pow(2,16)-1;

int 32位: -pow(2,32) ---  pow(2,32)-1;  long 64位  -pow(2,64) ---  pow(2,64)-1。

而Double 是浮点数表示了      2-1074  ---- (2-2-52)·21023.

 

char作为16位无符号整形 其范围为 0 -- 2的15次方 这无可争议 http://www.sunxin.org/article/445.html

-----------------------------------------------

http://developer.51cto.com/art/200804/69978.htm   位操作 应该给予重视 都忘了。。。

 

 

1+(33>>5)  注意 +的优先级 大于 >>的

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++的STL中实现由一个bitset类模板,其用法如下: std::bitset bs; 也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。 /** @defgroup Bitset Bitset位集类 * @{ */ //根据std::bitset改写,函数意义和std::bitset保持一致 class CORE_API Bitset: public Serializable { typedef typename uint32_t _Ty; static const int _Bitsperword = (CHAR_BIT * sizeof(_Ty)); _Ty * _Array; //最低位放在[0]位置,每位的默认值为0 int _Bits;//最大有效的Bit个数 private: int calculateWords()const; void tidy(_Ty _Wordval = 0); void trim(); _Ty getWord(size_t _Wpos)const; public: //默认构造 Bitset(); //传入最大的位数,每位默认是0 Bitset(int nBits); virtual ~Bitset(); //直接整数转化成二进制,赋值给Bitset,最高低放在[0]位置 Bitset(unsigned long long _Val); //拷贝构造函数 Bitset(const Bitset &amp; b); Bitset(const char * str); Bitset(const std::string &amp; str, size_t _Pos, size_t _Count); public: size_t size()const; //返回设置为1的位数 size_t count() const; bool subscript(size_t _Pos) const; bool get(size_t pos) const; //设置指定位置为0或1,true表示1,false表示0,如果pos大于数组长度,则自动扩展 void set(size_t _Pos, bool _Val = true); //将位数组转换成整数,最低位放在[0]位置 //例如数组中存放的1011,则返回13,而不是返回11 unsigned long long to_ullong() const; bool test(size_t _Pos) const; bool any() const; bool none() const; bool all() const; std::string to_string() const; public: //直接整数转化成二进制,赋值给Bitset,最高位放在[0]位置 Bitset&amp; operator = (const Bitset&amp; b); //直接整数转化成二进制,赋值给Bitset,最高位放在[0]位置 Bitset&amp; operator = (unsigned long long ull); //返回指定位置的值,如果pos大于位数组长度,自动拓展 bool operator [] (const size_t pos); //测试两个Bitset是否相等 bool operator == (const Bitset &amp; b); bool operator != (const Bitset &amp; b); Bitset operator&lt;&gt;(size_t _Pos) const; bool operator &gt; (const Bitset &amp; c)const; bool operator &lt; (const Bitset &amp; c)const; Bitset&amp; operator &amp;=(const Bitset&amp; _Right); Bitset&amp; operator|=(const Bitset&amp; _Right); Bitset&amp; operator^=(const Bitset&amp; _Right); Bitset&amp; operator&lt;&gt;=(size_t _Pos); public: Bitset&amp; flip(size_t _Pos); Bitset&amp; flip(); //将高位与低位互相,如数组存放的是1011,则本函数执行后为1101 Bitset&amp; reverse(); //返回左边n位,构成新的Bitset Bitset left(size_t n) const; //返回右边n位,构成新的Bitset Bitset right(size_t n) const; //判断b包含的位数组是否是本类的位数组的自串,如果是返回开始位置 size_t find (const Bitset &amp; b) const; size_t find(unsigned long long &amp; b) const; size_t find(const char * b) const; size_t find(const std::string &amp; b) const; //判断本类的位数组是否是b的前缀 bool is_prefix(unsigned long long &amp; b) const; bool is_prefix(const char * b) const; bool is_prefix(const std::string &amp; b) const; bool is_prefix(const Bitset &amp; b) const; void clear(); void resize(size_t newSize); void reset(const unsigned char * flags, size_t s); void reset(unsigned long long _Val); void reset(const char * _Str); void reset(const std::string &amp; _Str, size_t _Pos, size_t _Count); //左移动n位,返回新的Bitset //extendBits=false &quot;1101&quot; 左移动2位 &quot;0100&quot;; //extendBits=true &quot;1101&quot; 左移动2位 &quot;110100&quot;; Bitset leftShift(size_t n,bool extendBits=false)const; //右移动n位,返回新的Bitset //extendBits=false &quot;1101&quot; 右移动2位 &quot;0011&quot;; //extendBits=true &quot;1101&quot; 右移动2位 &quot;001101&quot;; Bitset rightShift(size_t n, bool extendBits = false) const; public: virtual uint32_t getByteArraySize(); // returns the size of the required byte array. virtual void loadFromByteArray(const unsigned char * data); // load this object using the byte array. virtual void storeToByteArray(unsigned char ** data, uint32_t&amp; length) ; // store this object in the byte array. };
`std::bitset` 是 C++ 标准库中提供的一个类模板,用于表示固定大小的二进制序列。它的原理是使用一个整数类型(通常是无符号整数)来存储二进制数据,并提供了一组成员函数和操作符来对二进制数据进行各种操作。 `std::bitset` 类模板的基本原理如下: 1. 内部存储:`std::bitset` 使用一个整数类型的变量来存储二进制数据。这个整数变量的大小由模板参数指定,例如 `std::bitset&lt;N&gt;` 中的 `N` 指定了位数。通常情况下,整数类型是无符号整数,如 `unsigned long long`。 2. 位级操作:`std::bitset` 提供了一组成员函数和操作符,用于对二进制数据进行位级操作。这些操作包括按位与(`&amp;`)、按位或(`|`)、按位异或(`^`)、按位取反(`~`)等。通过这些操作,你可以对 `std::bitset` 中的二进制数据进行位级运算。 3. 数值转换:`std::bitset` 支持将二进制数据转换为整数类型,以及将整数类型转换为二进制数据。你可以使用 `to_ulong()` 成员函数将 `std::bitset` 转换为无符号整数,或使用 `to_ullong()` 将其转换为无符号长长整数。相反,你可以使用 `std::bitset` 的构造函数将整数类型转换为 `std::bitset`。 4. 迭代器支持:`std::bitset` 支持迭代器,使你能够对 `std::bitset` 的每个位进行迭代访问。 通过这些原理和功能,`std::bitset` 提供了一种便捷的方式来处理和操作固定大小的二进制数据。 希望这能解答你的问题!如果还有其他疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值