Hola Joel

Yo solo mostre los ejemplos tal como aparecen en google. Tal vez si escribiera 
los 8 bits precedidos del 0b pero de todas formas no sirve, ignoro porque hay 
articulos que muestran ejemplos para GCC que no sirven en la realidad, a menos 
que sea para versiones mas viejas.

En realidad no deseo almacenar valores binarios, solo necesito hacer 
operaciones "bitwise" con bytes para implementar la codificacion BASE64 que 
utiliza 3 bytes juntos y los parte en 4 segmentos de 6 bits.

Por el momento la unica solucion fue convertir las constantes a hexadecimal y 
dejar comentado a un lado el valor binario para que el algoritmo fuera mas 
"visible" al seguirlo a ojo, deje algo asi como

out[0] = MIME_BASE64_CHARSET [ (uin[0]&0xFC/*11111100*/)>>2 ];

out[1] = MIME_BASE64_CHARSET [ (uin[0]&0x03/*00000011*/)<<4 |
                                                           
(uin[1]&0xF0/*11110000*/)>>4 ];

out[2] = MIME_BASE64_CHARSET [ (uin[1]&0x0F/*00001111*/)<<2 | 
                                                           
(uin[2]&0xC0/*11000000*/)>>6 ];

out[3] = MIME_BASE64_CHARSET [ (uin[2]&0x3F/*00111111*/) ];

que no fue la solucion que yo esperaba pero no encontre alternativas. Recuerdo 
en turbo c++ de borland habia que poner 01010011b y ya lo tomaba como binario 
pero al parecer no es una notacion estandar, asi que despues al trasladar mi 
codigo a vc++ seguramente tampoco iba a compilar suponiendo que el gcc si 
hubiera aceptado la forma que se mencionaba en google, creo que aunque no me 
gusto usar el hexadecimal fue la opcion mas practica.

Sobre el codigo que manejas, tal vez fuera mas comodo usar "bitfields" creo que 
se llamaban, el "problema" es que pone los bits en fila india uno tras otro sin 
tomar en cuenta el "byte order" que habia que arreglar a mano para que funcione 
bien en cualquier arquitectura, pues en intel hace swap de bytes/words y en 
otras no, que desmadre...

En fin gracias por el dato, aqui lo dejo como referencia en la carpeta de linux.

Saludos!



----- Original Message ----
From: Joel Rodriguez <j...@versamedium.com>
To: glo@glo.org.mx
Sent: Sun, November 1, 2009 5:01:28 AM
Subject: Re: [GLO] GCC & constantes binarias

Miguel:

eso sería 0x0a (hexadecimal)

mi impresión es que solo puedes almacenar información, minimamente como
1 byte (char),. o séa 8-bits, 2 hexadecimales.

lo siguiente sería como almacenar medio byte:

> invalid suffix "b1010" on integer constant

cualquier entero usa minimo 4 bytes en arquitecturas nuevas.

haciendo operaciones


suponiendo que quieres almacenar valores binarios en 4 bytes (int)
generas mascaras de 64 bits

int i;
unsigned long long int bit[i];
unsigned long long valbit;


for(i=0;i<64;i++) {
unsigint=(unsigned long long int) 1;
bit[i]=(unsigint<<i); /*mascara para cada uno de los 64 bits*/
valbit=0 | bit[i]; /*operacion OR binaria*/
printf("i=%d %lld \n",i,valbit); /* para ver que si, lo está haciendo*/
}


para empaquetar los valores binarios, haces como sigue con las mascaras bit[i]:


int s[10][64]; /* arreglo de 640 valores binarios muy eficiente ;) */

FILE *condinit;
...
for(cuenta=0;cuenta<10;cuenta++){
         for(kk=0;kk<64;kk++) {
      fscanf(condinit,"%f\n",&tempfloat);
     if(tempfloat==1.0) s[cuenta2]=s[cuenta] | bit[kk];    /*empaqueta un 1 o 
deja el cero con OR y mascara*/
                                                  }
                                                        }    ...

saludos,

Joel
:)






Miguel Cardenas wrote:
> Hola
> 
> A proposito del encoder para base64, al probarlo me encontre con algo raro, 
> resulta que necesito hacer algunas operaciones a nivel bit pero no me 
> funcionan las constantes binarias...
> 
> Si especifico algo como 01010 me lo toma como numero OCTAL, segun San Google 
> debo usar la notacion 0b1010 o 0B1010 para el GCC pero pura madre no es 
> cierto, al compilar me dice:
> 
> invalid suffix "b1010" on integer constant
> 
> Mi pregunta es: como jijos del maizal hago para introducir CONSTANTES 
> BINARIAS en GCC? siguiendo todos los articulos que me regresan google es 
> 0b+xxxxxx pero no es cierto, al menos en mi GCC 4.2.3
> 
> Gracias y saludos
> 
> 
>      
>  



Responder a