0

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

#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; 
} 
4

5 回答 5

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'for char
  2. 用于std::bitset打印位模式。
于 2013-07-26T15:42:22.047 回答
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;

在这一点上应该是不言自明的,但这可能会有所帮助:如何打印(使用 cout)数字存储在内存中的方式?

边注:

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

也应该是

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

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

于 2013-07-26T15:42:41.920 回答
2

尝试char j = 'j'而不是="j"为您的变量分配一个字符。“j”是一个字符串数组。

于 2013-07-26T15:38:18.750 回答
2

你忘了描述错误。大概是这样的

‘bitchar’ was not declared in this scope

因为你在调用它之前没有声明这个函数main。要么移动 before 的定义,要么bitcharmainbefore 或 inside 添加声明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';

最后,您可能希望反转字符串(或通过前置而不是附加来构建它)以获得更传统的最高有效位优先排序。

于 2013-07-26T16:03:00.833 回答
1

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

于 2013-07-26T15:37:49.630 回答