bitset用法詳解

一、bitset簡介

bitset是C++ STL庫中的一個類,用於存儲二進位位的布爾值,提供了簡單的位操作函數。bitset對象可以控制每個位的值為0或1。可以看做是一種高效的點陣圖。

#include
using namespace std;

二、bitset的常規用法

1、創建bitset變數

創建一個bitset變數,參數表示變數長度,即二進位位數。默認構造函數構造的bitset變數所有位的值都是0。通過構造函數bitset(int n, unsigned long value)可以構造一個值為value的n位bitset對象。

bitset bits;   //創建一個長度為8的bitset對象,所有位初始值都為0
bitset bits1(0b10101010); //創建一個長度為8的bitset對象,數值為0b10101010

2、訪問bitset變數

使用[]運算符或者字元串形式的下標來訪問bitset變數的對應位,如bits[2]或bits[「010」]表示訪問第3位,下標從0開始。

bitset bits(0b10101010);
cout<<bits[0]<<" "<<bits[2]<<" "<<bits[7]<<endl;  //輸出 0 1 0

3、bitset變數輸入輸出

bitset變數可以通過iostream庫中的輸入輸出函數使用,bitset對象可以用作輸出流和輸入流。

bitset bits(0b10101010);
cout<<bits<>bits;          //輸入一個二進位數到bits

4、bitset變數設置和清除

使用set()方法可以將某一位設置為1,reset()方法可以將某一位設置為0。

bitset bits;
bits.set(2);        //將第3位設置為1
bits.reset(1);      //將第2位設置為0

5、bitset變數的位運算

bitset對象提供了基本的位運算函數,包括按位與、按位或、按位異或、按位取反。可以使用與、或、異或、取反運算符或者對應的成員函數進行位運算。

bitset a(0b11001100);
bitset b(0b10101010);
bitset c = a & b;  //按位與
bitset d = a | b;  //按位或
bitset e = a ^ b;  //按位異或
bitset f = ~a;     //按位取反

三、bitset的高級用法

1、bitset對象的大小控制

使用size()方法可以獲取bitset對象的位數,max_size()方法可以獲取bitset對象所能包含的最大位數。使用count()方法可以獲取bitset中1的數量,flip()方法可以將所有位取反。

bitset bits(0b10101010);
cout<<bits.size()<<endl;    //輸出8,bits對象包含8個二進位位
cout<<bits.count()<<endl;   //輸出4,bits對象中1的數量為4
bits.flip();                //將所有位取反

2、bitset對象的截取和連接

使用to_ulong()和to_ullong()方法可以將bitset對象轉換為unsigned long和unsigned long long類型。使用to_string()方法可以將bitset對象轉化為string類型。使用operator<>可以將bitset對象截取或連接。兩個bitset對象可以拼接成一個較長的對象。

bitset a(0b1010);
bitset b(0b11110000);
unsigned long c = a.to_ulong();
cout<<c<<endl;              //輸出10,將a轉換為unsigned long類型
string d = a.to_string();
cout<<d<<endl;              //輸出「1010」,將a轉換為string類型
bitset e = (a<<8) | b;
cout<<e<<endl;              //輸出「101011110000」 用a左移8位的結果與b拼接成一個12位的bitset對象

四、bitset的應用

bitset可以用於大量的位運算問題,如壓位DP、遊戲中的狀態存儲、壓縮演算法、密碼學等方面。

代碼示例

#include
#include
using namespace std;

int main() {
  //常規用法
  bitset bits;   //創建一個長度為8的bitset對象,所有位初始值都為0
  bitset bits1(0b10101010); //創建一個長度為8的bitset對象,數值為0b10101010
  cout<<bits1[0]<<" "<<bits1[2]<<" "<<bits1[7]<<endl;  //輸出 0 1 0

  bitset bits2(0b10101010);
  cout<<bits2<>bits2;           //輸入一個二進位數到bits2

  bitset bits3(0b10101010);
  bits3.set(2);        //將第3位設置為1
  bits3.reset(1);      //將第2位設置為0
  cout<<bits3<<endl;    //輸出10101100

  bitset a(0b11001100);
  bitset b(0b10101010);
  bitset c = a & b;  //按位與
  bitset d = a | b;  //按位或
  bitset e = a ^ b;  //按位異或
  bitset f = ~a;     //按位取反
  cout<<c<<" "<<d<<" "<<e<<" "<<f<<endl;  //輸出「10001000 11101110 01100110 00110011」

  //高級用法
  bitset bits4(0b10101010);
  cout<<bits4.size()<<endl;    //輸出8,bits對象包含8個二進位位
  cout<<bits4.count()<<endl;   //輸出4,bits對象中1的數量為4
  bits4.flip();                //將所有位取反
  cout<<bits4<<endl;           //輸出「01010101」

  bitset a1(0b1010);
  bitset b1(0b11110000);
  unsigned long c1 = a1.to_ulong();
  cout<<c1<<endl;              //輸出10,將a1轉換為unsigned long類型
  string d1 = a1.to_string();
  cout<<d1<<endl;              //輸出「1010」,將a1轉換為string類型
  bitset e1 = (a1<<8) | b1;
  cout<<e1<<endl;              //輸出「101011110000」 用a1左移8位的結果與b1拼接成一個12位的bitset對象

  return 0;
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/191132.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 09:08
下一篇 2024-11-30 09:08

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25

發表回復

登錄後才能評論