C++ STL是否存在生成含偶数个置位比特数字的内置函数?求实现代码与逻辑
C++ STL中是否有生成偶数置位比特数字的内置函数?
嘿,好问题!首先明确一点:C++标准模板库(STL)里并没有专门用来生成或返回具有偶数个置位比特数字的内置函数。不过实现这个需求非常简单,我们可以借助STL提供的位操作工具来判断和生成这类数字,下面一步步拆解:
第一步:判断一个数字是否符合条件(偶数个置位比特)
要判断某个数字的置位比特数是否为偶数,我们可以用C++20引入的<bit>头中的std::popcount函数——它能直接返回数字中置位比特(也就是二进制里的1)的数量。之后只需要检查这个数量是否能被2整除即可。
代码示例:
#include <bit> #include <iostream> // 判断num是否有偶数个置位比特 bool has_even_set_bits(unsigned int num) { return std::popcount(num) % 2 == 0; } // 测试示例 int main() { std::cout << std::boolalpha; std::cout << "6的置位比特数是否为偶数?" << has_even_set_bits(6) << "\n"; // 输出true(二进制110,2个1) std::cout << "7的置位比特数是否为偶数?" << has_even_set_bits(7) << "\n"; // 输出false(二进制111,3个1) return 0; }
如果你的编译器不支持C++20,也可以用std::bitset的count()方法替代:
#include <bitset> bool has_even_set_bits(unsigned int num) { return std::bitset<32>(num).count() % 2 == 0; }
逻辑很直白:不管用哪种方法,先拿到置位比特的总数,对2取模等于0就说明是偶数个。
第二步:生成指定范围内的所有符合条件的数字
如果要生成某个范围(比如从0到N)内所有具有偶数个置位比特的数字,只需要遍历范围内的每个数,用上面的判断函数筛选即可。
代码示例:
#include <vector> #include <bit> // 生成从0到max_num之间所有有偶数个置位比特的数字 std::vector<unsigned int> generate_even_set_bit_numbers(unsigned int max_num) { std::vector<unsigned int> result; for (unsigned int num = 0; num <= max_num; ++num) { if (std::popcount(num) % 2 == 0) { result.push_back(num); } } return result; }
进阶优化:利用数学规律
其实这里有个有趣的数学规律:对于n位的二进制数(范围0到2^n - 1),具有偶数个置位比特的数字总数恰好是2(n-1)。比如3位二进制数(0-7),符合条件的有4个:0(0个1)、3(2个1)、5(2个1)、6(2个1),正好是2(3-1)=4。
如果需要生成大量符合条件的数字,或者范围极大,可以基于这个规律构造数字(比如通过组合数生成所有k个1的数,其中k是偶数),但对于大多数常规场景,遍历筛选的方法已经足够高效,代码也更简洁易懂。
内容的提问来源于stack exchange,提问作者Partth Kulkarni
相关产品推荐
相关产品推荐

