- C 标准库
- C 标准库
- C++ 标准库
- C++ 库 - 首页
- C++ 库 - <fstream>
- C++ 库 - <iomanip>
- C++ 库 - <ios>
- C++ 库 - <iosfwd>
- C++ 库 - <iostream>
- C++ 库 - <istream>
- C++ 库 - <ostream>
- C++ 库 - <sstream>
- C++ 库 - <streambuf>
- C++ 库 - <atomic>
- C++ 库 - <complex>
- C++ 库 - <exception>
- C++ 库 - <functional>
- C++ 库 - <limits>
- C++ 库 - <locale>
- C++ 库 - <memory>
- C++ 库 - <new>
- C++ 库 - <numeric>
- C++ 库 - <regex>
- C++ 库 - <stdexcept>
- C++ 库 - <string>
- C++ 库 - <thread>
- C++ 库 - <tuple>
- C++ 库 - <typeinfo>
- C++ 库 - <utility>
- C++ 库 - <valarray>
- C++ STL 库
- C++ 库 - <array>
- C++ 库 - <bitset>
- C++ 库 - <deque>
- C++ 库 - <forward_list>
- C++ 库 - <list>
- C++ 库 - <map>
- C++ 库 - <multimap>
- C++ 库 - <queue>
- C++ 库 - <priority_queue>
- C++ 库 - <set>
- C++ 库 - <stack>
- C++ 库 - <unordered_map>
- C++ 库 - <unordered_set>
- C++ 库 - <vector>
- C++ 库 - <algorithm>
- C++ 库 - <iterator>
- C++ 高级库
- C++ 库 - <any>
- C++ 库 - <barrier>
- C++ 库 - <bit>
- C++ 库 - <chrono>
- C++ 库 - <cinttypes>
- C++ 库 - <clocale>
- C++ 库 - <condition_variable>
- C++ 库 - <coroutine>
- C++ 库 - <cstdlib>
- C++ 库 - <cstring>
- C++ 库 - <cuchar>
- C++ 库 - <charconv>
- C++ 库 - <cfenv>
- C++ 库 - <cmath>
- C++ 库 - <ccomplex>
- C++ 库 - <expected>
- C++ 库 - <format>
- C++ 库 - <future>
- C++ 库 - <flat_set>
- C++ 库 - <flat_map>
- C++ 库 - <filesystem>
- C++ 库 - <generator>
- C++ 库 - <initializer_list>
- C++ 库 - <latch>
- C++ 库 - <memory_resource>
- C++ 库 - <mutex>
- C++ 库 - <mdspan>
- C++ 库 - <optional>
- C++ 库 - <print>
- C++ 库 - <ratio>
- C++ 库 - <scoped_allocator>
- C++ 库 - <semaphore>
- C++ 库 - <source_location>
- C++ 库 - <span>
- C++ 库 - <spanstream>
- C++ 库 - <stacktrace>
- C++ 库 - <stop_token>
- C++ 库 - <syncstream>
- C++ 库 - <system_error>
- C++ 库 - <string_view>
- C++ 库 - <stdatomic>
- C++ 库 - <variant>
- C++ STL 库速查表
- C++ STL - 速查表
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