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
广告