在char C ++中显示每个位

时间:2014-10-25 18:24:35

标签: c++

我想在char中显示每个位。然而,这不起作用:

    char flags = byteFromFile();
    for( int i = 0; i < 8; i++ ){
        int tmp = ( flags >> i ) & 0x2;
        cout << tmp;
    }
    cout << endl;

这段代码有什么问题?

我只得到零,但字节的值为3(我用调试器查找了它)。

4 个答案:

答案 0 :(得分:6)

如果你想显示位,你应该& 0x1而不是& 0x2 - 毕竟,你的结果应该是零或一。

答案 1 :(得分:3)

您的代码中存在几个问题。

  1. 您使用& 0x2代替& 0x1
  2. 您首先打印最不重要的位。
  3. 以下内容应解决这两个问题。

    #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。