c++ - letra - Cómo convertir cadena de valores binarios a char
decimal a binario en c (3)
Ejemplo
NOTA: que solo estoy preocupado por las letras. entonces el conjunto de bits 000001 sería a
o A
Tengo una string
llamada s
con el valor "abc"
. Tomo cada char
de la string
y la convierto en valor binario mediante el uso de bitset
.
p.ej
bitset <6> b1 = s[0]; //a
bitset <6> b2 = s[1]; //b
bitset <6> b3 = s[2]; //c
entonces quiero poner los resultados en una array
de strings
. El nombre de la matriz es arr
(y cada string
de la array
representará el valor binario de cada char
)
p.ej
arr[0] //will hold the value of char ''a'' in binary form which is 000001
arr[1] //will hold the value of char ''b'' in binary form which is 000010
arr[2] //will hold the value of char ''c'' in binary form which is 000011
y la forma en que convierto cada char
de la string
al binario es
arr[0] = b1.to_string(); //arr[0] is now 000001
arr[1] = b2.to_string(); //arr[1] is now 000010
arr[2] = b3.to_string(); //arr[2] is now 000011
Ahora aquí yace mi problema. ¿Cómo los convierto de nuevo en char
?
p.ej
//I want each char to take back the each corresponding letter from the binary values
char c1; //How do i make the arr[0] value of 000001 to become ''a'' again?
char c2; //Same here
char c3; //And here
Asumiendo que quiere comenzar en el código ASCII 64, y que ''a''
(o ''A''
) es simplemente 000001
en ese caso, entonces simplemente puede hacer
c1 = static_cast<char>(std::bitset<6>(arr[0]).to_ulong() + 64); //
''A''
en decimal es 65
, en binario es 0b01000001
. ''a''
en decimal es 97
, en binario es 0b01100001
. En su código, usa un conjunto de bitset<6>
para almacenar ''a''
(o ''A''
). Un conjunto de bitset<6>
solo puede representar 2^6
símbolos, es decir, 64
, por lo que encontrará corte. Básicamente se cortarán los 2
bits más significativos. En este caso, conjunto de bitset<6>(''A'')
convierte en 0b000001
, es decir, 1
en decimal, y conjunto de bitset<6>(''a'')
convierte en 0b1000001
, es decir, 33
en decimal. Ahora puede convencerse de que agregar nuevamente 64
produce el resultado correcto.
EDITAR
Tenga en cuenta que también puede usar std::stoi
(solo C ++ 11) para convertir la cadena de bits de la base 2 a decimal, como se menciona en las otras respuestas:
char c1 = static_cast<char>(std::stoi(arr[0], nullptr, 2) + 64);
Como usted indicó que ya no necesita std::bitset
después de convertir de binario a su representación char
, puede evitar usarlo para la conversión.
static_cast<char>(std::stoi(arr[i],0,2) + 64);
Interpreta la representación binaria original como un número base 2 (binario) y agrega 64. Dado que tiene las char
originales almacenadas en un formato binario en la matriz de arr
, puede pasarlas a std::stoi
y especificar que los valores son base 2, en el 3er parámetro. std::stoi
requiere 3 parámetros: la cadena que está tratando de convertir, un puntero a un int que almacenará el índice del primer carácter no convertido (no es necesario aquí, entonces puede dejarse como 0
) y la base de la cadena argumento. Aquí hay más información sobre eso . El resultado de la llamada std::stoi
es el equivalente de base 10 (decimal) de los valores binarios. La respuesta de vsoftco explica por qué agregar 64 es la operación apropiada para hacer aquí después de obtener una representación decimal. El resultado de esto se devuelve como un char
.
Si puede permitirse usar un std::bitset
más grande, puede incluso eliminar el agregado de 64.
Aquí hay una demostración en vivo:
considera lo siguiente:
std::cout << "abc" << std::endl;
std::cout << ''a'' << ''b'' << ''c'' << std::endl;
std::cout << std::dec
<< static_cast<int>(''a'') << " "
<< static_cast<int>(''b'') << " "
<< static_cast<int>(''c'') << " "<< std::endl;
std::cout << std::hex
<< static_cast<int>(''a'') << " "
<< static_cast<int>(''b'') << " "
<< static_cast<int>(''c'') << " "<< std::endl;
con salida
a B C
a B C
97 98 99
61 62 63
Esto muestra que cada char es binario, y 97 dec es 0x61 hex.
La conversión (a / desde binario mediante bitset) no es necesaria.
(o quizás no entiendo por qué no quieres hacer nada de una manera algo complicada).
Tenga en cuenta que static_cast <> no genera código gen. Tenga en cuenta que std :: dec y std :: hex no cambian a los datos, solo a la raíz.
editar --- Solo por 8 bits, podrías considerar esto ... sin problemas endian.
std::cout << (((''a'' >> 7) & 1) ? ''1'' : ''0'')
<< (((''a'' >> 6) & 1) ? ''1'' : ''0'')
<< (((''a'' >> 5) & 1) ? ''1'' : ''0'')
<< (((''a'' >> 4) & 1) ? ''1'' : ''0'')
<< (((''a'' >> 3) & 1) ? ''1'' : ''0'')
<< (((''a'' >> 2) & 1) ? ''1'' : ''0'')
<< (((''a'' >> 1) & 1) ? ''1'' : ''0'')
<< (((''a'' >> 0) & 1) ? ''1'' : ''0'') << " "
<< (((''b'' >> 7) & 1) ? ''1'' : ''0'')
<< (((''b'' >> 6) & 1) ? ''1'' : ''0'')
<< (((''b'' >> 5) & 1) ? ''1'' : ''0'')
<< (((''b'' >> 4) & 1) ? ''1'' : ''0'')
<< (((''b'' >> 3) & 1) ? ''1'' : ''0'')
<< (((''b'' >> 2) & 1) ? ''1'' : ''0'')
<< (((''b'' >> 1) & 1) ? ''1'' : ''0'')
<< (((''b'' >> 0) & 1) ? ''1'' : ''0'') << " "
<< (((''c'' >> 7) & 1) ? ''1'' : ''0'')
<< (((''c'' >> 6) & 1) ? ''1'' : ''0'')
<< (((''c'' >> 5) & 1) ? ''1'' : ''0'')
<< (((''c'' >> 4) & 1) ? ''1'' : ''0'')
<< (((''c'' >> 3) & 1) ? ''1'' : ''0'')
<< (((''c'' >> 2) & 1) ? ''1'' : ''0'')
<< (((''c'' >> 1) & 1) ? ''1'' : ''0'')
<< (((''c'' >> 0) & 1) ? ''1'' : ''0'') << " "
<< std::endl;
std::cout << std::dec << std::endl;
// with variable
char zulu = ''A'';
std::cout << std::dec
<< "NOTE: in this cout, every use of zulu is a ''read'' /n"
<< " zulu: " << zulu << " /n"
<< " dec : " << std::dec << static_cast<int>(zulu) << " /n"
<< " --- : " << zulu << " /n" // zulu not changed
<< " hex : " << std::hex << static_cast<int>(zulu) << " /n"
<< " --- : " << zulu << " /n" // zulu not changed
<< " bin : "
<< (((zulu >> 7) & 1) ? ''1'' : ''0'')
<< (((zulu >> 6) & 1) ? ''1'' : ''0'')
<< (((zulu >> 5) & 1) ? ''1'' : ''0'')
<< (((zulu >> 4) & 1) ? ''1'' : ''0'')
<< (((zulu >> 3) & 1) ? ''1'' : ''0'')
<< (((zulu >> 2) & 1) ? ''1'' : ''0'')
<< (((zulu >> 1) & 1) ? ''1'' : ''0'')
<< (((zulu >> 0) & 1) ? ''1'' : ''0'') << " /n"
<< " --- : " << zulu << " /n" // zulu not changed
<< " bitset: " << std::bitset<8>(zulu) << " /n"
<< " zulu: " << zulu << " /n/nzulu not changed!" // zulu not changed
<< std::endl;