#include <iostream>
#include <cstdint>
#include <bitset>
// 常用位操作
class BitOps
{
public:
// 设置第 n 位
static uint32_t setBit(uint32_t value, int n)
{
return value | (1u << n);
}
// 清除第 n 位
static uint32_t clearBit(uint32_t value, int n)
{
return value & ~(1u << n);
}
// 翻转第 n 位
static uint32_t toggleBit(uint32_t value, int n)
{
return value ^ (1u << n);
}
// 检查第 n 位是否设置
static bool testBit(uint32_t value, int n)
{
return (value & (1u << n)) != 0;
}
// 获取最低设置位
static uint32_t lowestSetBit(uint32_t value)
{
return value & (-value);
}
// 清除最低设置位
static uint32_t clearLowestSetBit(uint32_t value)
{
return value & (value - 1);
}
// 计算设置位数量(人口计数)
static int popcount(uint32_t value)
{
int count = 0;
while (value)
{
count += value & 1;
value >>= 1;
}
return count;
}
// 更快的 popcount(Brian Kernighan 算法)
static int popcountFast(uint32_t value)
{
int count = 0;
while (value)
{
value &= (value - 1);
++count;
}
return count;
}
// 判断是否为 2 的幂
static bool isPowerOfTwo(uint32_t value)
{
return value && !(value & (value - 1));
}
// 向上取整到 2 的幂
static uint32_t nextPowerOfTwo(uint32_t value)
{
--value;
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;
value |= value >> 8;
value |= value >> 16;
return ++value;
}
};
int main()
{
uint32_t value = 0b10110100;
std::cout << "Original: " << std::bitset<8>(value) << std::endl;
std::cout << "Set bit 0: " << std::bitset<8>(BitOps::setBit(value, 0)) << std::endl;
std::cout << "Clear bit 2: " << std::bitset<8>(BitOps::clearBit(value, 2)) << std::endl;
std::cout << "Toggle bit 7: " << std::bitset<8>(BitOps::toggleBit(value, 7)) << std::endl;
std::cout << "Test bit 4: " << BitOps::testBit(value, 4) << std::endl;
std::cout << "Popcount: " << BitOps::popcount(value) << std::endl;
std::cout << "\n7 is power of 2: " << BitOps::isPowerOfTwo(7) << std::endl;
std::cout << "8 is power of 2: " << BitOps::isPowerOfTwo(8) << std::endl;
std::cout << "Next power of 2 after 100: " << BitOps::nextPowerOfTwo(100) << std::endl;
return 0;
}