简单地将字符更改为其位表示

时间:2013-07-26 15:35:19

标签: c++ bitset std-bitset

为什么我收到错误?对我来说这看起来很简单。另外,这是我做我想做的最好的方法吗?

#include <iostream> 
#include <string>


int main() { 

char j = "J"; 
std::cout << bitchar(j);
return 0; 
} 


std::string bitchar(char c) { 
  std::string s;
  unsigned thisdivisor = (unsigned)c;
  while (!thisdivisor) { 
      s += thisdivisor % 2 ? '0' : '1';
      thisdivisor /= 2;
  }
  return s; 
} 

5 个答案:

答案 0 :(得分:3)

#include <iostream> 
#include <string>
#include <bitset>

int main() {   
    char j = 'J'; 
    std::cout << std::bitset<8>(j);
    return 0;  
} 

注意:

  1. "J"是一个单字符C风格的字符串(尾随\0), 您应该'J'使用char
  2. 使用std::bitset打印位模式。

答案 1 :(得分:2)

尝试使用char j = 'j'代替="j"为您的变量指定一个字符。 “j”是一个字符串数组。

答案 2 :(得分:2)

答案1:为什么我会收到这些错误

尝试char j = 'J',正如@losifM所说。双引号定义了一个字符数组,你正在寻找一个单一的字符(单引号)。

答案2:什么是更好的方法

更好的方法是使用std::bitset,然后使用cout对其进行流式传输。

//Add this
#include <bitset>

char j = 'j';
std::bitset<8> x(j);
std::cout << x;

此时应该是自我解释,但这可能有所帮助:How to print (using cout) the way a number is stored in memory?

旁注:

  s += thisdivisor % 2 ? '0' : '1';

也应该是

  s += thisdivisor % 2 ? '1' : '0';

因为如果thisdivisor % 2返回1true),您希望它将1添加到s,反之亦然。

答案 3 :(得分:2)

您忘了描述错误。据推测它就像

‘bitchar’ was not declared in this scope

因为在main中调用它之前没有声明该函数。在bitchar之前移动main的定义,或在main之前或之内添加声明:

std::string bitchar(char c);

然后你可能会得到类似的东西:

invalid conversion from ‘const char*’ to ‘char’

因为您正在尝试将字符串文字"J"分配给字符变量。使用字符文字'J'(带单引号)代替。

然后你会发现你没有得到任何输出。这是因为只要值为零,while (!thisdivisor)就会循环;因此,如果给它一个非零值,它将不会循环。您希望while (thisdivisor)(或while (thisdiviser != 0),如果您想要更明确),在 零时循环。

然后你会发现这些位是反转的;如果模数结果为零,你想要'0',而如果零你的测试给'0':

s += thisdivisor % 2 ? '1' : '0';

s += (thisdivisor % 2 == 0) ? '0' : '1';

最后,您可能想要反转字符串(或通过前置而不是附加来构建它)以获得更常规的最重要位优先排序。

答案 4 :(得分:1)

您正在将char数组(衰减到指针)分配给char(J)。 然后用char初始化std :: string(应该是c-string)。