【问题标题】:int to bool[] in c++在 C++ 中将 int 转换为 bool[]
【发布时间】:2012-01-14 15:37:24
【问题描述】:

我想要做的是给定一个参数const int &i,以bool 数组的形式返回i 的二进制表示的位(并且返回也很棒)...有谁知道吗?

【问题讨论】:

  • ¤ std::bitset< sizeof( int )*CHAR_BIT >( i ) 使这些位非常易于访问。干杯&hth.,

标签: c++ int boolean


【解决方案1】:

除非你真的需要它是一个专门的布尔数组,否则我会使用std::bitset

std::bitset bits<32>(i);

您通常可以将其视为 bool 数组、测试、设置和翻转单个位等。当然,如果您希望移植到具有不同 int 大小的东西,您可能需要将其修改为类似:

#define size (sizeof(int) * CHAR_BIT)

std::bitset bits<size>(i);

【讨论】:

  • "std::bitset bits&lt;32&gt;(i); 有点不好。请参阅我的回答作为评论。干杯,
  • @AlfP.Steinbach:刷新您的浏览器。在同一时间写同样的东西。
  • 哦。好吧#define size 也有点不好,抱歉。优先使用所有大写的宏名称(而不是其他任何名称)。这是因为宏不尊重作用域,并且名称 size 很容易出现在其他代码中,并具有其他一些预期含义。比重命名更好的解决方法是编写例如int const intSize = (sizeof(int)*CHAR_BIT);。一个主要区别是此定义尊重范围。另一个主要区别是它的名称intSize 是不言自明的:它记录了它是什么。干杯,
  • @AlfP.Steinbach 这对我来说看起来不错。它回答了与编码约定无关的问题。但你在这方面是正确的......
  • @AlfP.Steinbach:谢谢你提醒我为什么我不再在 c.l.c++.m 附近闲逛了。
【解决方案2】:

编辑:正如比我更有经验的人指出的那样,如果数字为负数,这样做可能会导致问题(发生的情况完全取决于您的编译器)。无论如何,以这种方式处理负数是没有意义的,除非您还规定了返回值将使用哪种算术表示(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 永不改变。
  • @minitech i &gt;&gt;= 1 表示i = i &gt;&gt; 1
  • 小心i是否定的。
  • 在很多机器上,给它一个负数会无限循环(或者直到你的vector&lt;bool&gt;内存用完为止)。
  • @cnicutar:那是在我评论后编辑的;)那行以前不存在。
猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2015-12-01
  • 2017-07-17
  • 2023-03-27
  • 2014-09-19
相关资源
最近更新 更多