Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Valores int a binarios en char

Estas en el tema de Valores int a binarios en char en el foro de C/C++ en Foros del Web. Hola, buen día, tengo el siguiente problema, no tengo mucha experiencia en C++ y agradecería si me pudiesen ayudar. Tengo un vector con valores enteros, ...
  #1 (permalink)  
Antiguo 15/03/2009, 01:38
 
Fecha de Ingreso: marzo-2009
Mensajes: 4
Antigüedad: 15 años, 1 mes
Puntos: 0
Valores int a binarios en char

Hola, buen día, tengo el siguiente problema, no tengo mucha experiencia en C++ y agradecería si me pudiesen ayudar.

Tengo un vector con valores enteros, por ejemplo: Vector = [1 3 2 5 4 6];

Lo que necesito, es guardar 2 valres por byte, esos 6 valores me llevarian 3 bytes.

Si represento esos valores en binario, yo tendria algo así : 0001 0011 0010 0101 0100 0110

Entonces, quiero tomar de dos en dos, y guardarlos en un byte cada par. De tal forma que yo tendría
1er byte 00010011
2do byte 00100101
3er byte 01000110

Quiero que esos valores esten en un arreglo char ( que ocupa un byte), de 3 elementos. Por ejemplo

unsigned char Valores[3]; y..

Valores[1] = 00010011
Valores[2] = 00100101
Valores[3] = 01000110

Agradecería mucho su ayuda. Disculpen mi falta de experiencia.
  #2 (permalink)  
Antiguo 15/03/2009, 03:47
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Valores int a binarios en char

Para lograr ubicar e interpretar correctamente los numeros tenes que usar los operadores bitwise: shift (<<, >>), and (&) y or (|).

Teniendo nuestro array de char:
char v[5];
v[0] = 3 | (1 << 4); //<< 4 mueve 4 bits a la izquierda, es el equivalente a * 16

entonces nos queda que v[0] = 3 | 16 =19 = 10011.
idem para v[1] = 5 | 32 = 37 = 100101.
y etc.

Para interpretarlo la parte baja del byte se obtiene usando una mascara que invalida la alta:
v[0] & 0x0F
19 & 0x0F = 10011 & 1111 = 11 = 3.

Para la parte alta usamos la operacion inversa y ponemos los bits altos encima de los bajos empujandolos a la derecha:
v[0] >> 4 //mueve 4 bits a la derecha, es el equivalente a / 16
19 / 16 = 1.

PD. Tal como lo pediste pones 3, 1; 5, 2; etc.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 15/03/2009, 17:59
 
Fecha de Ingreso: marzo-2009
Mensajes: 4
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Valores int a binarios en char

Hola, gracias por la aportación, creo que tambien se puede hacer así si no me equivoco. Pongo el código:
//------------------------------------------------------------------------------------------------------
int valores[] = {1,3,2,0,5,4};
unsigned char buffer[3];
char result[100]; //Para mostrar los valores en binario con itoa


int cont = 0; //Para incrementar el indice de los valores
for(int i=0; i<3;i++){
buffer[i] = (valores[cont]<<4) | (valores[cont+1]); // Acomoda los numeros en
//la parte baja y alta
itoa(buffer[i],result,2); //Convierte a binario
cout<< result <<"\n"; //Muestrael valor binario en pantalla
cont=cont+2;
}
//----------------------------------------------------------------------------------------------------


Pongo también el código completo para escribirlo y abrirlo de un archivo.

//-------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <fstream>
#include <iostream>
#include <cstdlib>

using namespace std;

int main ()
{

int valores[] = {1,3,2,0,5,4};
ofstream oss("datos.bin", ios::binary); //Declaracion archivo de salida
ifstream iss("datos.bin", ios::binary); //Declaración archivo de entrada

unsigned char buffer[3];
char result[100]; //Para mostrar los valores en binario


int cont = 0; //Para incrementar el indice de los valores
for(int i=0; i<3;i++){
buffer[i] = (valores[cont]<<4) | (valores[cont+1]); // Acomoda los
// numeros en la parte baja y alta
oss.write((char const*)&buffer[i], 1); // Lo escribe en archivo
itoa(buffer[i],result,2); //Convierte a binario
cout<< result <<"\n"; //Muestrael valor binario en pantalla
cont=cont+2;
}

oss.close();

char v;
for(int i=0; i<3; i++){
iss.read((char*)&v, sizeof(v)); //Lee los valores del archivo
cout <<(int)v << " "; //Los despiega en pantalla con valores
}

return 0;
}
//-----------------------------------------------------------------------------------

Para este ejemplo, que se introdujo int valores[] = {1,3,2,0,5,4};
los valores leidos y mostrados del archivo son : 19 32 84
que en binario seria:
00010011 , 00100000, 01010100

Espero y no estar equivocandome en algo. Gracias
  #4 (permalink)  
Antiguo 16/03/2009, 02:22
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Valores int a binarios en char

Cita:
Iniciado por jessiebm Ver Mensaje
Hola, gracias por la aportación, creo que tambien se puede hacer así si no me equivoco.
Si, esa es exactamente la manera que te dije para representar los dos numeros en un solo byte.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:18.