c++中bitset的常見(jiàn)用法示例詳解
C++ 中的 bitset
是一個(gè)用于處理固定大小位序列的模板類,提供高效的位操作功能。以下是對(duì)其關(guān)鍵特性的詳細(xì)介紹:
1. 聲明與初始化
- 頭文件:需包含
<bitset>
。 - 聲明:
bitset<N>
表示一個(gè)包含N
位的二進(jìn)制集合(N
為編譯時(shí)常量)。
bitset<8> b1; // 默認(rèn)初始化,所有位為0 bitset<4> b2(5); // 用整數(shù)初始化:0101 bitset<4> b3("1010"); // 用字符串初始化:1010 bitset<4> b4(b3); // 拷貝構(gòu)造
2. 初始化規(guī)則
- 整數(shù)初始化:高位截?cái)啵臀粚?duì)齊。
bitset<3> b(10); // 10的二進(jìn)制為1010 → 截?cái)酁?10(值為2)
- 字符串初始化:
- 字符串只能包含
'0'
和'1'
。 - 默認(rèn)從字符串的 左端(高位) 開(kāi)始解析。
- 字符串只能包含
bitset<4> b("1010"); // 高位 → 低位:1 0 1 0 → 十進(jìn)制10 bitset<4> b("101010", 2, 4); // 從索引2取4位:"1010" → 值為10
3. 常用操作
位訪問(wèn):
[]
運(yùn)算符:通過(guò)索引訪問(wèn)(從右到左,0為最低位)。test(pos)
:檢查指定位是否為1,越界拋出異常。
bitset<4> b("1010"); bool bit0 = b[0]; // 0 → 最低位 bool bit3 = b[3]; // 1 → 最高位
修改位:
set(pos, val)
:設(shè)置某位(默認(rèn)1)。reset(pos)
:清除某位(設(shè)為0)。flip(pos)
:翻轉(zhuǎn)某位。
b.set(0); // 1010 → 1011 b.reset(3); // 1011 → 0011 b.flip(1); // 0011 → 0001
統(tǒng)計(jì)與判斷:
count()
:返回1的個(gè)數(shù)。any()/none()/all()
:判斷是否存在/沒(méi)有/全部為1。
if (b.any()) cout << "至少1位為1";
4. 位運(yùn)算
- 支持
&
、|
、^
、~
、<<
、>>
等運(yùn)算符(長(zhǎng)度需相同):
bitset<4> a("1010"), b("1100"); auto c = a & b; // 1000 auto d = a << 1; // 0100
5. 類型轉(zhuǎn)換
to_ulong()/to_ullong()
:轉(zhuǎn)為無(wú)符號(hào)整數(shù)(可能溢出)。to_string()
:轉(zhuǎn)為字符串,可指定填充字符。
bitset<4> b(10); string s = b.to_string(); // "1010"
6. 應(yīng)用場(chǎng)景
- 位標(biāo)志管理:如權(quán)限控制、狀態(tài)標(biāo)記。
- 位掩碼操作:快速篩選或修改特定位。
- 數(shù)據(jù)壓縮:高效存儲(chǔ)布爾值。
示例代碼
#include <bitset> #include <iostream> using namespace std; int main() { bitset<8> b1(42); // 00101010 bitset<8> b2("10101010"); // 10101010 cout << b1 << endl; // 輸出 00101010 b1.set(0); // 變?yōu)?00101011 b2.flip(); // 變?yōu)?01010101 cout << (b1 & b2) << endl; // 00000001 cout << b1.to_ulong() << endl; // 43 return 0; }
注意事項(xiàng)
- 越界訪問(wèn):
test(pos)
會(huì)檢查越界,[]
不會(huì)。 - 性能:位操作高效,適合密集運(yùn)算。
- 字符串順序:字符串的第一個(gè)字符對(duì)應(yīng)高位。
bitset
是處理二進(jìn)制數(shù)據(jù)的利器,結(jié)合明確的位序規(guī)則和豐富的接口,可顯著簡(jiǎn)化位級(jí)操作代碼。
到此這篇關(guān)于c++中bitset的常見(jiàn)用法的文章就介紹到這了,更多相關(guān)c++ bitset用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問(wèn)題(典型問(wèn)題)
這篇文章主要介紹了關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問(wèn)題,是一個(gè)非常典型的問(wèn)題,本文通過(guò)實(shí)例舉例給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-02-02如何寫(xiě)好C main函數(shù)的幾個(gè)注意事項(xiàng)
這篇文章主要介紹了如何寫(xiě)好C main函數(shù)的幾個(gè)注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06字符串中找出連續(xù)最長(zhǎng)的數(shù)字字符串的實(shí)例代碼
這篇文章介紹了字符串中找出連續(xù)最長(zhǎng)的數(shù)字字符串的實(shí)例代碼,有需要的朋友可以參考一下2013-09-09C++實(shí)現(xiàn)幸運(yùn)大抽獎(jiǎng)(QT版)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)幸運(yùn)大抽獎(jiǎng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01C++聚合體初始化aggregate initialization詳細(xì)介紹
這篇文章主要介紹了C++聚合體初始化aggregate initialization,C++有很多初始化對(duì)象的方法。其中之一叫做 聚合體初始化(aggregate initialization) ,這是聚合體專有的一種初始化方法2023-02-02