-1

我想将一串字符(显然是每个字节)转换为一串 1 和 0,它们代表每个字符的二进制代码,最低有效位在前。

例如,字符串“Ab3”将变为“A”的“10000010”与“b”的“01000110”与“3”的“11001100”连接。请注意所有字符都是 8 位的,我认为是这种情况,因为字符需要正确保存所有 8 位。如果这是真的,那么这个例子的整个字符串应该是“100000100100011011001100”

我想不出如何使用位移运算符来做到这一点,因为你不能将每一位都转换成一个字符,但我知道必须有办法做到这一点。

注意:我不允许在这个项目中使用 bitset(或任何 STL)。

谢谢您的帮助!

4

4 回答 4

3
stringstream ss; 

for(char c: std::string("Ab3")) 
     ss << std::bitset<8>(c);  

cout << ss.str();
于 2013-07-29T17:50:22.150 回答
2

使用std::bitset

#include <iostream>
#include <bitset>
#include <climits>

int main()
{
    std::string bits;
    std::string s = "abcd";

    for (std::string::iterator it = s.begin(); it != s.end(); it++) {
        std::bitset<CHAR_BIT> bset;
            bset |= (unsigned char)*it;
            bits += bset.to_string();
    }

    std::cout << bits << std::endl;
    return 0;
}

编辑:根据愚蠢的限制重写相关部分:

std::string bits;
std::string s = "abcd";

for (std::string::iterator it = s.begin(); it != s.end(); it++) {
    unsigned char c = *it;

    for (int i = CHAR_BIT - 1; i >= 0; i--)
        bits += '0' + ((c >> i) & 1);
}

std::cout << bits << std::endl;
于 2013-07-29T17:53:48.963 回答
0

我想不出如何使用位移运算符来做到这一点,因为你不能将每一位都转换成一个字符,但我知道必须有办法做到这一点。

多看一点位移,也许?这不是 STL 函数。我敢打赌你的教授正试图让你接近低级位操作。

于 2013-07-29T18:08:38.413 回答
0

您将需要使用位移和屏蔽。

void output_binary_rep(const std::string text&, std::ostream& output)
{
    // Look up CHAR_BIT, which contains the number of bits per character.
    const unsigned int length = text.length();

    // For each character in the string, do:
    for (unsigned int i = 0U; i < length; ++i)
    {
        // For each bit in the character, output a '1' or '0'.
        for (unsigned int j = 0; j < CHAR_BIT; ++j)
        {
             // Isolate a bit, from MSB to LSB, using
             // a 1 left shited by a number of bits.
             if (text[i] & (1 << (CHAR_BIT - j - 1)))
             {
                 output << "1";
             }
             else
             {
                 output << "0";
             }
        }
    }
}
于 2013-07-29T19:56:58.443 回答