我想在char中显示每个位。然而,这不起作用:
char flags = byteFromFile();
for( int i = 0; i < 8; i++ ){
int tmp = ( flags >> i ) & 0x2;
cout << tmp;
}
cout << endl;
这段代码有什么问题?
我只得到零,但字节的值为3(我用调试器查找了它)。
答案 0 :(得分:6)
如果你想显示位,你应该& 0x1
而不是& 0x2
- 毕竟,你的结果应该是零或一。
答案 1 :(得分:3)
您的代码中存在几个问题。
& 0x2
代替& 0x1
。以下内容应解决这两个问题。
#include <iostream>
int main(int argc, char** argv)
{
unsigned char flags = argv[1][0];
for (int i = 7; i >= 0; --i)
{
std::cout << ((flags >> i) & 0x1);
}
std::cout << '\n';
}
答案 2 :(得分:1)
您的代码有几个问题,但我必须构建自己的测试用例才能找到它们。下次,请自己做。特别是,您引用了一个未知函数byteFromFile()
。
修正版:
#include <iostream>
int main()
{
const unsigned char flags = 0x03;
for (size_t i = 0; i < 8; i++)
std::cout << ((flags >> i) & 0x1);
std::cout << '\n';
}
您AND
错误的值,而且您确实希望输入为unsigned char
。
尽管如此,如果你真的想要正确地做到这一点,请查看std::bitset
,这样可以免除你需要弄乱循环和转移。
答案 3 :(得分:1)
尝试以下
#include <iostream>
#include <climits>
int main()
{
char c = 'A';
for ( size_t i = CHAR_BIT; i != 0; --i )
{
std::cout << ( ( unsigned char )c >> ( i - 1 ) & 1 );
}
std::cout << std::endl;
return 0;
}
输出
01000001
它对应于&#39; A&#39;的ASCII代码65。