更多精彩內容,請關注微信公衆號:後端技術小屋c++
bitset
bitset中STL中用於表示位圖的容器,它支持讀寫特定bit、從整數或字符串生成bitset對象。bitset大小經過模板參數指定,一旦編譯器肯定便沒法變動,這一點與vector<bool>
有差別。後端
bitset
是_Base_bitset
的派生類。_Base_bitset
中包含一個長度_Nw
,類型unsigned long
的數組,其中_Nw
經過模板參數指定。在64位系統中,unsigned long
長度爲8 Byte。數組
注意,這裏_Nb
不必定是8 * sizeof(unsigned)
的整數倍,因此須要宏__BITSET_WORDS
對其進行向上取整操做。微信
template<size_t _Nb> class bitset : private _Base_bitset<__BITSET_WORDS(_Nb)> { private: typedef _Base_bitset<__BITSET_WORDS(_Nb)> _Base; typedef unsigned long _WordT; ... } template<size_t _Nw> struct _Base_bitset { typedef unsigned long _WordT; _WordT _M_w[_Nw]; // 0 is the least significant word. ... }
__val
值賦給數組的首個元素。最後使用_M_do_sanitize
判斷_Nb
是否是sizeof(unsigned long)
的整數倍,不然將right padding bits
所有置爲1。bitset(unsigned long __val) : _Base_bitset<__BITSET_WORDS(_Nb)>(__val) { _M_do_sanitize(); } _Base_bitset(unsigned long __val) { _M_do_reset(); _M_w[0] = __val; } void _M_do_sanitize() { _Sanitize<_Nb%__BITS_PER_WORD>::_M_do_sanitize(this->_M_hiword()); } template <size_t _Extrabits> struct _Sanitize { static void _M_do_sanitize(unsigned long& __val) { __val &= ~((~static_cast<unsigned long>(0)) << _Extrabits); } }; __STL_TEMPLATE_NULL struct _Sanitize<0> { static void _M_do_sanitize(unsigned long) {} };
explicit bitset(const basic_string<char>& __s, size_t __pos = 0, size_t __n = basic_string<char>::npos) : _Base() { if (__pos > __s.size()) __STL_THROW(out_of_range("bitset")); _M_copy_from_string(__s, __pos, __n); }
to_ulong: 將bitset轉化爲ulong類型數據結構
to_string: 將bitset轉化爲'0' '1'組成的字符串源碼分析
<<=: 邏輯左移,移出部分補零。注意:在實現上,數組_M_w
中低位對應bitset中低位,所以,對bitset的左移操做其實就是對數組的右移操做,右移同理。若是移動位數是8 * sizeof(unsigned long)
的整數倍,則直接移動數組中元素便可。this
const size_t __sub_offset = __BITS_PER_WORD - __offset; for (size_t __n = _Nw - 1; __n > __wshift; --__n) _M_w[__n] = (_M_w[__n - __wshift] << __offset) | (_M_w[__n - __wshift - 1] >> __sub_offset); _M_w[__wshift] = _M_w[0] << __offset; }
const size_t __sub_offset = __BITS_PER_WORD - __offset; for (size_t __n = 0; __n < __limit; ++__n) _M_w[__n] = (_M_w[__n + __wshift] >> __offset) | (_M_w[__n + __wshift + 1] << __sub_offset); _M_w[__limit] = _M_w[_Nw-1] >> __offset;
留下問題給讀者思考:爲什麼bitset中的數組類型是unsigned long而非unsigned char?code
推薦閱讀對象
更多精彩內容,請掃碼關注微信公衆號:後端技術小屋。若是以爲文章對你有幫助的話,請多多分享、轉發、在看。
接口