Chapter 12.特殊容器bitset

bitset简介

bitset是一个特殊的容器用来存储位的状态,元素只可能是0、1或者true、false
bitset这个类非常类似一般的数组,但是被优化为一个元素只用1个位来存储,但是因为C++环境中不存在这么小的类型,所以用最小的bool类型来模拟
bitset可以随机访问,即支持下标访问
Constructor
1.bitset ( );
2.bitset ( unsigned long val );
3.template<class charT, class traits, class Allocator>
explicit bitset ( const basic_string<charT,traits,Allocator>& str,
   typename basic_string<charT,traits,Allocator>::size_type pos = 0,
   typename basic_string<charT,traits,Allocator>::size_type n =
      basic_string<charT,traits,Allocator>::npos);
eg:
  bitset<10> first;                   // empty bitset
  bitset<10> second (120ul);          // initialize from unsigned long to binary is:0001111000
  bitset<10> third (string("01011")); // initialize from string
applicable operators
***
bitset<N>& operator&= (const bitset<N>& rhs);
bitset<N>& operator|= (const bitset<N>& rhs);
bitset<N>& operator^= (const bitset<N>& rhs);
bitset<N>& operator<<= (size_t pos);
bitset<N>& operator>>= (size_t pos);
bitset<N> operator~() const;
bitset<N> operator<<(size_t pos) const;
bitset<N> operator>>(size_t pos) const;
bool operator== (const bitset<N>& rhs) const;
bool operator!= (const bitset<N>& rhs) const;
*** global functions: ***
template<size_t N>
  bitset<N> operator& (const bitset<N>& lhs, const bitset<N>& rhs);
template<size_t N>
  bitset<N> operator| (const bitset<N>& lhs, const bitset<N>& rhs);
template<size_t N>
  bitset<N> operator^ (const bitset<N>& lhs, const bitset<N>& rhs);
//
*** iostream global functions (extraction/insertion): ***
template<class charT, class traits, size_t N>
  basic_istream<charT, traits>&
    operator>> (basic_istream<charT,traits>& is, bitset<N>& rhs);
template<class charT, class traits, size_t N>
  basic_ostream<charT, traits>&
    operator<< (basic_ostream<charT,traits>& os, bitset<N>& rhs);
eg:
  bitset<4> first (string("1001"));
  bitset<4> second (string("0011"));
  cout << (first^=second) << endl;          // 1010 (XOR,assign)
  cout << (first&=second) << endl;          // 0010 (AND,assign)
  cout << (first|=second) << endl;          // 0011 (OR,assign)
  cout << (first<<=2) << endl;              // 1100 (SHL,assign)
  cout << (first>>=1) << endl;              // 0110 (SHR,assign)
  cout << (~second) << endl;                // 1100 (NOT)
  cout << (second<<1) << endl;              // 0110 (SHL)
  cout << (second>>1) << endl;              // 0001 (SHR)
  cout << (first==second) << endl;          // false (0110==0011)
  cout << (first!=second) << endl;          // true  (0110!=0011)
  cout << (first&second) << endl;           // 0010
  cout << (first|second) << endl;           // 0111
  cout << (first^second) << endl;           // 0101
Bit access:
operator[]Access bit
eg:
	bitset<10> bs(120UL);
	for (size_t i = 0; i != 10; ++i)
	{
		cout << bs[i];
	}
	bs[1] = bs[2];
	bs[3] = true;
Bit operations:
setSet bits
resetReset bits
flipFlip bits
//set
1.bitset<N>& set ( );//全部设置为1
2.bitset<N>& set ( size_t pos, bool val = true );//对应位置设置为1
eg:
  bitset<4> mybits;
  cout << mybits.set() << endl;       // 1111
  cout << mybits.set(2,0) << endl;    // 1011
  cout << mybits.set(2) << endl;      // 1111
//reset
1.bitset<N>& reset ( );//全部设置为0
2.bitset<N>& reset ( size_t pos );//对应位置设置为0
//flip
1.bitset<N>& flip ( );//翻转bitset,所有的元素,0→1,1→0
2.bitset<N>& flip ( size_t pos );//对应位置翻转
Bitset operations:
to_ulongConvert to unsigned long integer//如果bitset转为unsigned long太长,则抛出异常
to_stringConvert to string
countCount bits set//i.e.,value is 1
sizeReturn size
testReturn bit value//0 or 1
anyTest if any bit is set//看bitset里有无元素值为1,有则返回true,否则返回false
noneTest if no bit is set//看bitset里有无元素值为0,有则返回true,否则返回false
//to_ulong
eg:
  bitset<4> mybits;     // mybits: 0000
  mybits.set();         // mybits: 1111
  cout << mybits << " as an integer is: " << mybits.to_ulong() << endl;
//to_string
template <class charT, class traits, class Allocator>
  basic_string<charT,traits,Allocator> to_string() const;
eg:
  string mystring;
  bitset<4> mybits;     // mybits: 0000
  mybits.set();         // mybits: 1111
  mystring=mybits.to_string<char,char_traits<char>,allocator<char> >();
  cout << "mystring: " << mystring << endl;
Output:
1111
//test
eg:
 bitset<5> mybits (string("01011"));
  cout << "mybits contains:\n";
  cout << boolalpha;
  for (size_t i=0; i<mybits.size(); ++i)
    cout << mybits.test(i) << endl;
Output:
mybits contains:
true
true
false
true
false
//any
eg:
	bitset<16> mybits;
	cout << "enter a binary number: ";
	cin >> mybits;//1011
	if (mybits.any())
		cout << "mybits has " << (int)mybits.count() << " bits set.\n";
	else cout << "mybits has no bits set.\n";
Output:
mybits has 3 bits set.
//none
eg:
	bitset<16> mybits;
	cout << "enter a binary number: ";
	cin >> mybits;//1011
	if (mybits.none())
		cout << "mybits has no bits unset.\n";
	else
		cout << "mybits has " << (int)mybits.count() << " bits unset.\n";
Output:
mybits has 1 bits unset.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java.util.BitSet是Java中的一个类,它实现了一个位向量,可以用来表示一组位值。它提供了一系列方法来操作位集合,比如设置位、清除位、翻转位等等。\[1\]在引用\[1\]的示例代码中,展示了如何使用BitSet类来进行位操作。首先创建了两个BitSet对象bits1和bits2,然后通过set方法设置了一些位的值。接下来,展示了如何使用AND、OR和XOR操作来对位集合进行逻辑运算。\[1\] 在引用\[2\]中的示例代码中,展示了如何使用BitSet类来判断一个字符串中的哪些字符出现过。通过遍历字符串的每个字符,使用set方法将对应的位设置为true。然后通过toString方法将出现过的字符以字符串的形式返回。\[2\] 在引用\[3\]中的代码片段中,展示了BitSet类的set方法的源码。该方法用于将指定索引处的位设置为true。\[3\] #### 引用[.reference_title] - *1* [JAVA Bitset类](https://blog.csdn.net/m0_37062111/article/details/128724495)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [java.util.BitSet](https://blog.csdn.net/zengxiantao1994/article/details/76514490)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [java.util.BitSet 分析 ](https://blog.csdn.net/lgshendy/article/details/84725100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值