将字符简单地更改为其位表示
simple change of a character to its bit representation
为什么会出现错误?对我来说,这看起来很简单。而且,这是做我想做的事情的最好方法吗?
#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;
}
注:
- CCD_ 1是单字符C风格字符串(具有尾随的CCD_,您应该将
'J'
用于char
- 使用
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';
因为如果