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

simple change of a character to its bit representation

本文关键字:表示 字符 简单      更新时间:2023-10-16

为什么会出现错误?对我来说,这看起来很简单。而且,这是做我想做的事情的最好方法吗?

#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; 
} 
#include <iostream> 
#include <string>
#include <bitset>
int main() {   
    char j = 'J'; 
    std::cout << std::bitset<8>(j);
    return 0;  
} 

注:

  1. CCD_ 1是单字符C风格字符串(具有尾随的CCD_,您应该将'J'用于char
  2. 使用std::bitset打印位模式

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

您忘记描述错误了。大概有点像

‘bitchar’ was not declared in this scope

因为在main中调用函数之前没有声明它。将bitchar的定义移动到"J"0之前,或者在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';

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

答案1:为什么我会出现这些错误

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

答案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';

因为如果0返回1true),则希望它将1添加到s,反之亦然。

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