C++ 将字符串转换为表示这些字符的1和0字符串

C++ 将字符串转换为表示这些字符的1和0字符串,c++,character-encoding,type-conversion,C++,Character Encoding,Type Conversion,我想将一个字符串(显然每个字节)转换成一个1和0的字符串,表示每个字符的二进制代码,其中最低位在前 例如,字符串“Ab3”将变成“1000010”,表示“A”,并连接“01000110”,表示“b”,并连接“11001100”,表示“3”。注意所有字符都是8位,我认为是这样的,因为字符需要全部8位才能正确保存。如果这是真的,那么本例中的整个字符串应为“100000010010001011001100” 我想不出如何使用bitshift操作符来实现这一点,因为不能将每一位都转换成一个字符,但我知道

我想将一个字符串(显然每个字节)转换成一个1和0的字符串,表示每个字符的二进制代码,其中最低位在前

例如,字符串“Ab3”将变成“1000010”,表示“A”,并连接“01000110”,表示“b”,并连接“11001100”,表示“3”。注意所有字符都是8位,我认为是这样的,因为字符需要全部8位才能正确保存。如果这是真的,那么本例中的整个字符串应为“100000010010001011001100”

我想不出如何使用bitshift操作符来实现这一点,因为不能将每一位都转换成一个字符,但我知道一定有办法做到这一点

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

谢谢你的帮助

stringstreamss;
stringstream ss; 

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

cout << ss.str();
for(字符c:std::string(“Ab3”))
ss使用
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;
}
#包括
#包括
#包括
int main()
{
std::字符串位;
std::string s=“abcd”;
对于(std::string::iterator it=s.begin();it!=s.end();it++){
std::位集bset;
b集|=(无符号字符)*它;
位+=b设置为_字符串();
}
标准:cout>i)和1);
}
标准::cout
我想不出如何使用bitshift操作符来实现这一点,因为不能将每一位都转换成一个字符,但我知道一定有办法做到这一点


也许,你会更仔细地观察一下,看看是否有点移位?这不是STL函数。我敢打赌,你的教授正试图把你推向低级位运算。

你需要使用位移位和掩蔽

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";
             }
        }
    }
}
void output\u binary\u rep(常量std::string text&,std::ostream&output)
{
//查找字符位,它包含每个字符的位数。
常量unsigned int length=text.length();
//对于字符串中的每个字符,请执行以下操作:
用于(无符号整数i=0U;i如果(文本[i]&(1)你怎么知道
char
的宽度是8位?谢谢你的回复,但我不允许为这个项目使用位集。@LeonidVolnitsky有一次我因为假设POSIX可用性而被否决了……太糟糕了。谢谢你的回答,但我不允许在这个项目中使用位集。@user0123你不认为这值得一提吗你不能使用标准库类!!!???是的,我很抱歉,我在帖子中添加了这个。哈哈,我再次道歉。我忘记了大多数人都没有我在这个项目上的荒谬限制。@user0123是的……我还将写一个没有
位集的答案。同时,获取一个关于二进制数的好教程系统和按位操作(以及C++中相应的运算符)。您的问题是如何将字节转换为二进制字符串表示形式,对于使用STL的答案为+1,对于带有伪限制的问题为-1,但需要在不使用位集或任何STL库的情况下执行此操作。编辑:什么是“伪限制”?这是一个数据结构类的项目,教授明确表示,我们可能不会使用任何STL库,除非。
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";
             }
        }
    }
}