我有一个有趣的小问题,我知道有多种解决方法,但我想知道最好/最有效的方法是什么。
例如,假设我有一个整数为534和一个可以存储16个布尔值的数组
现在,534的二进制表示是10000010110
最好的方法是如何从534到
array[0] = 0
array[1] = 1
array[2] = 1
array[3] = 0
array[4] = 1
....
array[15] = 0
感谢您的提前帮助!
我有一个有趣的小问题,我知道有多种解决方法,但我想知道最好/最有效的方法是什么。
例如,假设我有一个整数为534和一个可以存储16个布尔值的数组
现在,534的二进制表示是10000010110
最好的方法是如何从534到
array[0] = 0
array[1] = 1
array[2] = 1
array[3] = 0
array[4] = 1
....
array[15] = 0
使用std::bitset<16>
并调用operator[]
来访问单个位:
#include <iostream>
#include <bitset>
int main()
{
std::bitset<16> bits(534);
std::cout << bits << std::endl;
//use operator[] to access individual bits
std::cout << bits[2] << std::endl;
}
输出(演示):
0000001000010110
1
这可能不是最高效的方法,但如果考虑到安全性,那么它是原始数组类型的较好替代品。效率差异几乎可以忽略不计。
如果位数在编译时未知,并且可以在运行时确定,则boost::dynamic_bitset
将对您有所帮助。请查看它:
根据其文档,
dynamic_bitset类表示一组位。它通过operator []提供对单个位的值的访问,并提供所有可应用于内置整数的按位操作符,例如operator&和operator<<。集合中的位数是通过动态位集的构造函数参数在运行时指定的。
dynamic_bitset类与std :: bitset类几乎相同。区别在于,动态位集的大小(位数)在动态位集对象的构造期间通过参数指定,而std :: bitset的大小是通过整数模板参数在编译时指定的。
像这样:
for (unsigned int i = 0; i != 16; ++i)
{
array[i] = n & 1;
n /= 2;
}