【发布时间】:2012-01-14 15:37:24
【问题描述】:
我想要做的是给定一个参数const int &i,以bool 数组的形式返回i 的二进制表示的位(并且返回也很棒)...有谁知道吗?
【问题讨论】:
-
¤
std::bitset< sizeof( int )*CHAR_BIT >( i )使这些位非常易于访问。干杯&hth.,
我想要做的是给定一个参数const int &i,以bool 数组的形式返回i 的二进制表示的位(并且返回也很棒)...有谁知道吗?
【问题讨论】:
std::bitset< sizeof( int )*CHAR_BIT >( i ) 使这些位非常易于访问。干杯&hth.,
除非你真的需要它是一个专门的布尔数组,否则我会使用std::bitset:
std::bitset bits<32>(i);
您通常可以将其视为 bool 数组、测试、设置和翻转单个位等。当然,如果您希望移植到具有不同 int 大小的东西,您可能需要将其修改为类似:
#define size (sizeof(int) * CHAR_BIT)
std::bitset bits<size>(i);
【讨论】:
std::bitset bits<32>(i); 有点不好。请参阅我的回答作为评论。干杯,
#define size 也有点不好,抱歉。优先使用所有大写的宏名称(而不是其他任何名称)。这是因为宏不尊重作用域,并且名称 size 很容易出现在其他代码中,并具有其他一些预期含义。比重命名更好的解决方法是编写例如int const intSize = (sizeof(int)*CHAR_BIT);。一个主要区别是此定义尊重范围。另一个主要区别是它的名称intSize 是不言自明的:它记录了它是什么。干杯,
编辑:正如比我更有经验的人指出的那样,如果数字为负数,这样做可能会导致问题(发生的情况完全取决于您的编译器)。无论如何,以这种方式处理负数是没有意义的,除非您还规定了返回值将使用哪种算术表示(1s 补码?2s 补码?前缀符号位?)所以这种方法实际上是据我所知,对负数没用。
很抱歉将注意力转移到更有价值的答案上。
原创
嗯,我想到了:
int i = 42; // or whatever
std::vector<bool> vec;
while(i) {
vec.push_back(i & 1);
i >>= 1;
}
std::reverse(vec);
当然这不是一个数组,但是如果你想要的话,将向量的内容复制到一个数组是很简单的,例如:
bool boolArray[] = new bool[vec.size()];
std::copy(vec.rbegin(), vec.rend(), boolArray);
【讨论】:
i 永不改变。
i >>= 1 表示i = i >> 1。
i是否定的。
vector<bool>内存用完为止)。