Convertir de Long a Binario

Iniciado por BlaineMonkey, 21 Junio 2011, 15:04 PM

0 Miembros y 2 Visitantes están viendo este tema.

BlaineMonkey

Tengo una variable long y quiero convertir el número a binario, pero no sé cómo hacerlo.  Pongo un ejemplo de qué es lo que quiero, para ver si se os ocurre como podría hacerlo.
Ejemplo:
long valor = 5
int binData[8]={0,0,0,0,0,0,0,0};

Quiero guardar el 5 en binario en un array de 8 enteros el valor.

Ejemplo:
binData contendría el array siguiente: {0,0,0,0,0,1,0,1};

¿Cómo puedo hacerlo?

Ca0s

Haz la conversión a binario tal cual la harías con boli y papel...
Te pongo la conversión (la imprime al revés):


#include <stdio.h>
int main()
{
  long num=5;
  long res=0;
  long coc=0;
  while(num>=2)
  {
coc=num/2;
res=num%2;
printf("%i", res);
num=coc;
  }
  printf("%i\n", num);
  return 0;
}

BlackZeroX

#2
.

Asi tambien se puede: <Aqui esta el codigo Corriendo en CodePad>



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct _byte_bits {
    unsigned bit0:1;
    unsigned bit1:1;
    unsigned bit2:1;
    unsigned bit3:1;
    unsigned bit4:1;
    unsigned bit5:1;
    unsigned bit6:1;
    unsigned bit7:1;
};

int main()
{
    long        _long   = 78;
    int         _i      = 0;
    _byte_bits  _binary[sizeof(long)];

    memset( &_binary , 0 , sizeof(_byte_bits)*sizeof(long) );
    memcpy( &_binary , &_long , sizeof(_byte_bits)*sizeof(long) );

    for ( _i=(sizeof(_byte_bits)-1) ; _i>=0 ; --_i ) {
        fprintf( stdout , "%d" , _binary[_i].bit7 );
        fprintf( stdout , "%d" , _binary[_i].bit6 );
        fprintf( stdout , "%d" , _binary[_i].bit5 );
        fprintf( stdout , "%d" , _binary[_i].bit4 );
        fprintf( stdout , "%d" , _binary[_i].bit3 );
        fprintf( stdout , "%d" , _binary[_i].bit2 );
        fprintf( stdout , "%d" , _binary[_i].bit1 );
        fprintf( stdout , "%d" , _binary[_i].bit0 );
    }
    return 0;
}


Dulces Lunas!¡.
The Dark Shadow is my passion.

Khronos14

Los números long son de 4 bytes por lo tanto tienen 32 bits. Yo lo hice con un número de 8 bits, o sea, de tipo unsigned char.

Código (cpp) [Seleccionar]

#include <iostream>

int main(int argc, char * argv[])
{
unsigned char numBin[8], numero = 5;
unsigned char aux = 0;

for (int i = 0; i < 8; i++)
{
aux = numero >> (7 - i);
aux = aux << 7;

if (aux == 128)
numBin[i] = 0x31; //Un 1
else
numBin[i] = 0x30; //Un 0
std::cout << numBin[i];
}
std::cin.get();
return 0;
}


Son puras matemáticas, se van desplazando los bits de derecha a izquierda para conseguir que quede 128, si es así significa que el bit actual es 1.

Saludos.

BlackZeroX

#4
.
Con mascaras y con el dezplazamiento de bits ( los dos metodos mas rapidos ) puedes obtener el numero binario.

Aqui te dejo el codigo corriendo http://codepad.org/jfxvOYW5



#include <stdio.h>

int main() {
    unsigned char byte = 205;
    fprintf( stdout , "%d" , (byte & 0x80)>>7 );
    fprintf( stdout , "%d" , (byte & 0x40)>>6 );
    fprintf( stdout , "%d" , (byte & 0x20)>>5 );
    fprintf( stdout , "%d" , (byte & 0x10)>>4 );
    fprintf( stdout , "%d" , (byte & 0x8)>>3 );
    fprintf( stdout , "%d" , (byte & 0x4)>>2 );
    fprintf( stdout , "%d" , (byte & 0x2)>>1 );
    fprintf( stdout , "%d" , (byte & 0x1) );
    return 0;
}



P.D.: Los numeros Long dependen su longitud de bytes segun la arquitectura del PC es decir en una architectura x32 = 4 bytes y en una de x64 son 8 bytes... segun se la que le seguira en un futuro la de x128 sera de 16 bytes...

Dulces Lunas!¡.
The Dark Shadow is my passion.

Khronos14

BlackZeroX no se de donde sacaste eso de los números long, pero yo tengo Win7 SP1 64 bits y haciendo un sizeof al tipo long me dice que son 4 bytes. Todo esto usando el Visual C++ 2010.

Saludos.

Queta

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

Akai

Khronos14 y Queta:

http://en.wikipedia.org/wiki/Long_integer

Fijaos en la diferencia según el sistema o el estándar que se use.

Por ejemplo, Linux kernel 2.6.39 x64 usando gcc 4.6:

#include <stdio.h>

int main(){

printf("%d %d %d\n",sizeof(int),sizeof(long),sizeof(long int));

return 0;

}


resultado:
4 8 8

Queta

Obviamente, ya es lo que dije:

Citar* The values of the columns Size and Range depend on the system the program is compiled for. The values shown above are those found on most 32-bit systems. But for other systems, the general specification is that int has the natural size suggested by the system architecture (one "word") and the four integer types char, short, int and long must each one be at least as large as the one preceding it, with char being always one byte in size. The same applies to the floating point types float, double and long double, where each one must provide at least as much precision as the preceding one.

http://www.cplusplus.com/doc/tutorial/variables/
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

Khronos14

Vale hombre, no hagamos un flame de esto xD

Tan sólo me pareció raro, porque siempre pensé que el tipo long en Windows era de 4 bytes.

En mi Debian, con gcc version 4.4.5 (Debian 4.4.5-8) y Linux 2.6.32-5-686:


#include <stdio.h>

int main(){

printf("%d %d %d\n",sizeof(int),sizeof(long),sizeof(long int));

return 0;

}


Me da esto:
4 4 4

Saludos.