C++ 位函数对象
什么是位函数对象
在 C++ STL 中,位函数对象(bit function objects)是一组特殊的函数对象,专门用于处理整数类型的按位逻辑运算。这些函数对象封装了常见的位操作符(如 &、|、^、~ 等),使得我们可以在算法中灵活地执行位运算。
位函数对象定义在 <functional>
头文件中,是 STL 函数对象家族的一部分。与其他函数对象一样,它们也可以与 STL 算法配合使用,增强代码的可读性和通用性。
常用的位函数对象
C++ STL 提供了以下几种常用的位函数对象:
bit_and<T>
:执行按位与(&)操作bit_or<T>
:执行按位或(|)操作bit_xor<T>
:执行按位异或(^)操作bit_not<T>
:执行按位取反(~)操作
其中,T
是模板参数,表示要操作的整数类型,如 int
、long
、char
等。
位函数对象的基本用法
让我们通过一些简单的例子来了解位函数对象的基本用法:
#include <iostream>
#include <functional>
int main() {
// 创建位函数对象
std::bit_and<int> bitAnd;
std::bit_or<int> bitOr;
std::bit_xor<int> bitXor;
std::bit_not<int> bitNot;
int a = 5; // 二进制: 0101
int b = 3; // 二 进制: 0011
// 使用位函数对象
std::cout << "a & b = " << bitAnd(a, b) << std::endl; // 输出: 1 (0001)
std::cout << "a | b = " << bitOr(a, b) << std::endl; // 输出: 7 (0111)
std::cout << "a ^ b = " << bitXor(a, b) << std::endl; // 输出: 6 (0110)
std::cout << "~a = " << bitNot(a) << std::endl; // 输出: -6 (取决于整数表示方式)
return 0;
}
输出:
a & b = 1
a | b = 7
a ^ b = 6
~a = -6
位函数对象与 STL 算法结合
位函数对象的真正威力在于与 STL 算法的结合使用。下面是一些常见的应用场景:
使用 transform 算法进行批量位运算
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<int> v2 = {5, 4, 3, 2, 1};
std::vector<int> result(5);
// 对两个向量中的对应元素执行按位异或操作
std::transform(v1.begin(), v1.end(), v2.begin(),
result.begin(), std::bit_xor<int>());
std::cout << "异或结果: ";
for (int n : result) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
输出:
异或结果: 4 6 0 6 4
使用 accumulate 算法计算多个数的按位操作结果
#include <iostream>
#include <functional>
#include <vector>
#include <numeric>
int main() {
std::vector<int> numbers = {0b1010, 0b1100, 0b0110, 0b0011};
// 计算所有数字按位与的结果
int andResult = std::accumulate(numbers.begin(), numbers.end(),
~0, std::bit_and<int>());
// 计算所有数字按位或的结果
int orResult = std::accumulate(numbers.begin(), numbers.end(),
0, std::bit_or<int>());
std::cout << "按位与结果: " << andResult << " (二进制: "
<< std::bitset<4>(andResult) << ")" << std::endl;
std::cout << "按位或结果: " << orResult << " (二进制: "
<< std::bitset<4>(orResult) << ")" << std::endl;
return 0;
}
备注
上面的代码中使用了 std::bitset
来显示二进制表示,需要包含 <bitset>
头文件。