C++ 庫 - <bit>



C++ 中的<bit> 標頭檔案提供了多個用於位操作和按位運算的函式,這些函式對於底層程式設計任務至關重要。包括用於計數位、查詢最高/最低設定位等的函式。此標頭檔案是數值庫的一部分。

包含 <bit> 標頭檔案

要在 C++ 程式中包含 <bit> 標頭檔案,可以使用以下語法。

#include <bit>

<bit> 標頭檔案的函式

以下是 <bit> 標頭檔案中所有函式的列表。

型別轉換和位元組操作

在 C++ 中,型別轉換和位元組操作函式處理在位元組級別的資料型別表示。資料的二進位制表示對於資料序列化和效能最佳化至關重要。

序號 函式和描述
1 bit_cast

此函式將一種型別的物件表示重新解釋為另一種型別的物件表示。

2 byteswap

此函式反轉給定整數值中的位元組。

手動實現 byteswap

在下面的示例中,我們將手動實現 byteswap。

#include <bit>
#include <iostream>
uint16_t manual_byteswap(uint16_t value) {
    return (value >> 8) | (value << 8); 
}

int main() {
    uint16_t value = 0x1234; 
    uint16_t swapped = manual_byteswap(value); 
    std::cout << std::hex << swapped; 
    return 0;
}

輸出

如果我們執行上面的程式碼,它將生成以下輸出:

3412

二次冪運算

透過使用這些運算,我們可以檢查一個數是否為 2 的冪,或者找到最接近的 2 的冪,可以最佳化記憶體分配或按位運算。

序號 函式和描述
1 has_single_bit

此函式檢查一個數是否是 2 的整數冪。

2 bit_ceil

此函式查詢大於或等於給定值的最小 2 的整數冪。

3 bit_floor

此函式查詢小於或等於給定值的最大的 2 的整數冪。

4 bit_width

此函式查詢表示給定值所需的最少位數。

查詢最小冪

在下面的示例中,我們將使用 bit_ceil 查詢 2 的最小冪。

#include <bit>
#include <iostream>

int main() {
    uint32_t value = 10; 
    uint32_t ceil_value = std::bit_ceil(value); 
    std::cout  << ceil_value;
    return 0;
}

輸出

如果我們執行上面的程式碼,它將生成以下輸出:

16

按位旋轉

按位旋轉涉及將數字的位向左或向右移動。這些旋轉通常用於加密演算法、雜湊函式和底層最佳化。

序號 函式和描述
1 rotl

此函式計算按位左旋轉的結果。

2 rotr

此函式計算按位右旋轉的結果。

旋轉位

在下面的示例中,我們將使用 rotl 將數字的位向左旋轉。

#include <bitset>
#include <bit>
#include <iostream>
uint8_t manual_rotl(uint8_t value, int shift) {
    return (value << shift) | (value >> (8 - shift));
}
int main() {
    uint8_t value = 0b10110001; 
    uint8_t rotated = manual_rotl(value, 2); 
    std::cout << std::bitset<8>(rotated); 
    return 0;
}

輸出

如果我們執行上面的程式碼,它將生成以下輸出:

11000110

位計數

位計數函式用於計算連續位(0 或 1)或設定為 1 的總位數。這些操作主要用於底層程式設計,其中有效地操作單個位可以顯著最佳化效能。

序號 函式和描述
1 countl_zero

此函式計算從最高有效位開始的連續 0 位數。

2 countl_one

此函式計算從最高有效位開始的連續 1 位數。

3 countr_zero

此函式計算從最低有效位開始的連續 0 位數。

4 countr_one

此函式計算從最低有效位開始的連續 1 位數。

5 popcount

此函式計算無符號整數中 1 的位數。

手動計數位

在下面的示例中,我們將使用 popcount 來計算數字中設定為 1 的位數。

#include <bit>
#include <iostream>
uint32_t manual_popcount(uint32_t value) {
    uint32_t count = 0;
    while (value) {
        count += value & 1; 
        value >>= 1;       
    }
    return count;
}
int main() {
    uint32_t value = 0b10110001; 
    uint32_t count = manual_popcount(value);
    std::cout << "Number of 1s: " << count; 
    return 0;
}

輸出

如果我們執行上面的程式碼,它將生成以下輸出:

Number of 1s: 4
廣告