elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  enteros de 12 bits
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: enteros de 12 bits  (Leído 4,294 veces)
integeroverflow

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: enteros de 12 bits
« Respuesta #10 en: 4 Marzo 2017, 14:19 pm »

Hola no entiendo esto.
A ver tu tienes un array ejemplo:
int arr [2];

Y le asignas dos valores:
arr[0] = 0110 1010
arr[1] = 1100 0001

Código:
((short)arr[0])    //casteando a short nos quedaria el byte dentro de 2 bytes, es asi?

Eso quiere decir que tu cadena se alarga en 16 bits.
 
en realidad no estamos hablando de una cadena, si no de numeros enteros. lo que sucede al castear es que el compilador va a tratar ese numero como si fuesen 2 bytes. no se alarga en 16 bits, si no que en 8.
es como el siguiente ejemplo en decimal (es ilustrativo, nada que ver con programacion):
15 // el 15 expresado en un supuesto tipo de datos de 2 digitos
0015 // el 15 expresado en un supuesto tipo de datos de 4 digitos. mismo numero, mayor cantidad de digitos disponibles
Citar
Pero porqué este valor?
Código:
0000 0000 0110 1010 // quedando este valor
queda ese valor porque los tipos de datos que yo manejo al principio son CHAR, o sea, 1 byte (8 bits). al castearlo a short (2 bytes, 16 bits), me queda un numero de 16 digitos, como el valor es el mismo que antes los 8 nuevos digitos quedan en 0
Citar
Aqui dices esto:
Código:
"<< 4" desplazaria los bits 4 veces hacia la izquierda, correcto?
0000 1010 0110 0000 // quedando este valor

Pero lo correcto seria¿Porque este número de donde lo sacaron?:
Código:
0000 1100 0000 0000
si tengo este numero: 0000 0000 1010 0110, y muevo 4 posiciones a la izq, queda 0000 1010 0110 0000, el numero que pusiste ahi le estan faltando 4 bits, 0110
Citar
Lo usastes en la posicion 1¿?
Código:
arr[1] >> 4

Y porque devuelve este valor?:
Código:
0000 1100 0000 0000

Aplicando esto:
Código:
0000 0000 0110 1010 | 0000 1100 0000 0000
esto no es una division, es el operador OR. lo que hace, si miramos la tabla:

INPUT    OUTPUT
A    B    A OR B
0    0    0
0    1    1
1    0    1
1    1    1

devuelve 1 si alguno de los 2 digitos es 1, caso contrario devuelve 0. entonces se puede usar para copiar un conjunto de bits.
ejemplo:

  1101
  0001
=1101 (uno y cero da 1, 0 y 0 da 0, 1 y 1 da 1)
Citar
Cuanto devolvería y porque? A vale es una division ok.
En cuanto esto sería una simple suma es correcto?
   1101 1001 1100 1000
   0000 0000 1111 1111
= 0000 0000 1100 1000

Hace tiempo que no repasaba las operaciones en binario tendré que repasarlas si me podeis aclarar alguno de estos puntos me seria util gracias.

Por otro lado porque
 0xFF valdria 0000 0000 1111 1111 ?



0xFF tiene ese valor porque la F en hexadecimal vale 15. si hacemos la cuenta:


Código:
0 = 0
1 = 1
10 = 2
11 = 3
100 = 4
101 = 5
110 = 6
111 = 7
1000 = 8
1001 = 9
1010 = 10
1011 = 11
1100 = 12
1101 = 13
1110 = 14
1111 = 15

entonces teniendo 0xFF nos quedaria el siguiente valor

1111 1111

el grupo del ceros al principio es porque estamos hablando de un short, o sea 2 bytes o 16 bits. quedando:

0000 0000 1111 1111.

espero se haya entendido.


« Última modificación: 4 Marzo 2017, 14:48 pm por integeroverflow » En línea

integeroverflow

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: enteros de 12 bits
« Respuesta #11 en: 4 Marzo 2017, 14:30 pm »

Código
  1. #include <stdio.h>
  2.  
  3. // Enteros de 12 bit
  4. // 000111001001
  5. // 000111001010
  6. // 000111001011
  7. // 000111001100
  8. // 000111001101
  9. // 000111001110
  10.  
  11. // 457 458 459 460 461 462
  12.  
  13. unsigned char a[9] = {
  14. 0b00011100,
  15. 0b10010001,
  16. 0b11001010,
  17. 0b00011100,
  18. 0b10110001,
  19. 0b11001100,
  20. 0b00011100,
  21. 0b11010001,
  22. 0b11001110
  23. };
  24.  
  25. int main()
  26. {
  27.  
  28.  
  29. for(int i=0; i<9; i++)
  30. {
  31. if(i % 2){
  32. short y = 0;
  33. y = ((a[i] & 0xF) << 8);
  34. y |= ((a[i+1] & 0xFF));
  35. printf("%d\n", y);
  36.  
  37. } else {
  38.  
  39. short x = 0;
  40. x = (a[i] << 4) | ((a[i+1] >> 4) & 0xF);
  41. printf("%d\n", x);
  42. }
  43. }
  44. }
  45.  

dejo mi codigo a ver si me podes ayudar.
si te fijas arriba del todo, hay una lista de enteros de 12 bits. abajo su valor en decimal.
luego tenemos un array de bytes que contiene estos enteros de 12 bits en enteros de 8 bits.
es decir, cada elemento par del array contiene 2 tercios del entero que representa, y cada elemento impar contiene 1 tercio del entero representado por el elemento anterior y 1 tercio del entero que representa el elemento siguiente.

para verlo con mas claridad:
Citar
unsigned char a[9] = {
 0b00011100,
 0b10010001,
 0b11001010,
 0b00011100,
 0b10110001,
 0b11001100,
 0b00011100,
 0b11010001,
 0b11001110
};

en el codigo lo que hago es ir elemento por elemento y chequear si es par o impar. si es par, shifteo a la izquierda 4 bits y tomo los primeros  4 bits del elemento siguiente. si es impar, elimino los primeros 4 bits, shifteo a la izquierda 8 bits, y copio el contenido del elemento siguiente.
ese codigo funciona bien, lo pruebo y me devuelve el valor decimal que tiene que devolver.

sin embargo, falla en algunos elementos.
que puede estar causando el problema?

output:

Código:
457
458
3233
3249
2844
3100
461
462
3296


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: enteros de 12 bits
« Respuesta #12 en: 4 Marzo 2017, 21:45 pm »

No depende de si el byte es par o impar. Depende del resto de dividir entre 3:

Código
  1. int main()
  2. {
  3. for(int i=0; i<9; i++)
  4. {
  5. if(i % 3 == 1){
  6. short x = ((a[i] & 0xF) << 8);
  7. x |= ((a[i+1] & 0xFF));
  8. printf("%d\n", x);
  9.  
  10. } else if(i % 3 == 0) {
  11.  
  12. short x = (a[i] << 4) | ((a[i+1] >> 4) & 0xF);
  13. printf("%d\n", x);
  14. }
  15. }
  16. }
En línea

integeroverflow

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: enteros de 12 bits
« Respuesta #13 en: 4 Marzo 2017, 22:59 pm »

No depende de si el byte es par o impar. Depende del resto de dividir entre 3:

Código
  1. int main()
  2. {
  3. for(int i=0; i<9; i++)
  4. {
  5. if(i % 3 == 1){
  6. short x = ((a[i] & 0xF) << 8);
  7. x |= ((a[i+1] & 0xFF));
  8. printf("%d\n", x);
  9.  
  10. } else if(i % 3 == 0) {
  11.  
  12. short x = (a[i] << 4) | ((a[i+1] >> 4) & 0xF);
  13. printf("%d\n", x);
  14. }
  15. }
  16. }

ahora si, funciona perfecto.

pero no me quedo claro, que tiene que ver el resto de la division con 3? me podrias explicar asi logro entenderlo?

te agradezco
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: enteros de 12 bits
« Respuesta #14 en: 5 Marzo 2017, 00:13 am »

Citar
unsigned char a[9] = {
 0b00011100, // 0 (entero 1)
 0b10010001, // 1 (entero 2)
 0b11001010, // 2 (nada)
 0b00011100, // 0 (entero 1)
 0b10110001, // 1 (entero 2)
 0b11001100, // 2 (nada)
 0b00011100, // 0 (entero 1)
 0b11010001, // 1 (entero 2)
 0b11001110 // 2 (nada)
};

Tienes 2 enteros cada 3 bytes.
En el primer bytes, obtienes el primer entero (accediendo, además, al siguiente byte)
En el segundo byte, obtienes el segundo entero (accediendo también al siguiente byte)
El tercer byte es, en su totalidad, parte del anterior entero. Aquí no hay anda que hacer

Y repites. 3 bytes, 2 acciones.
En línea

integeroverflow

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: enteros de 12 bits
« Respuesta #15 en: 5 Marzo 2017, 09:40 am »

Tienes 2 enteros cada 3 bytes.
En el primer bytes, obtienes el primer entero (accediendo, además, al siguiente byte)
En el segundo byte, obtienes el segundo entero (accediendo también al siguiente byte)
El tercer byte es, en su totalidad, parte del anterior entero. Aquí no hay anda que hacer

Y repites. 3 bytes, 2 acciones.

ahora si, lo entiendo perfectamente.

esto sucedia si chequeaba par o impar:

1111 1111 // byte 0 = 1111 1111 1001
1001 0110 // byte 1 = 0110 1011 1011
1011 1011 // byte 2 = 1011 1011 1100
1100 0011

ahora cada 3 bytes el byte es salteado.

muchas gracias por tu ayuda amigo !!!
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: enteros de 12 bits
« Respuesta #16 en: 5 Marzo 2017, 12:41 pm »

A ver, he encontrado esto: http://www.disc.ua.es/~gil/FAT12Description.pdf

Según el paper los 12 bits se consiguen de esta forma:

Suponiendo que 3 bytes consecutivos tienen la siguiente información (supongamos también que cada bit del byte puede alojar un número decimal):

PosiciónByte
076543210
154321098
232109876

Bien, pues el primer número de 12 bits sería el 109876543210
y el segundo número de 12 bits sería el 321098765432

Esto es así porque la FAT se hizo para máquinas IBM, y esas son little-endian, lo que quiere decir que el LSB se encuentra en la parte baja de la memoria. Traducido:
Para formar la representación de los 12 bits del primer número debes tomar
· Del 2º byte los 4 bits menos significativos : 1098
· Del 1er byte todos los bits : 76543210

Para formar la representación de los 12 bits del segundo número debes tomar
· Del 3er byte todos los bits : 321098765432
· Del 2º byte los 4 bits más significativos
En línea

integeroverflow

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: enteros de 12 bits
« Respuesta #17 en: 5 Marzo 2017, 20:12 pm »

A ver, he encontrado esto: http://www.disc.ua.es/~gil/FAT12Description.pdf

Según el paper los 12 bits se consiguen de esta forma:

Suponiendo que 3 bytes consecutivos tienen la siguiente información (supongamos también que cada bit del byte puede alojar un número decimal):

PosiciónByte
076543210
154321098
232109876

Bien, pues el primer número de 12 bits sería el 109876543210
y el segundo número de 12 bits sería el 321098765432

Esto es así porque la FAT se hizo para máquinas IBM, y esas son little-endian, lo que quiere decir que el LSB se encuentra en la parte baja de la memoria. Traducido:
Para formar la representación de los 12 bits del primer número debes tomar
· Del 2º byte los 4 bits menos significativos : 1098
· Del 1er byte todos los bits : 76543210

Para formar la representación de los 12 bits del segundo número debes tomar
· Del 3er byte todos los bits : 321098765432
· Del 2º byte los 4 bits más significativos

que tal hermano
gracias por tu respuesta. ya habia visto ese PDF, la informacion sobre el formato FAT12 ya la tenia, mi duda era sobre las operaciones binarias en c lo cual ya lo solucione.

claro que la operacion que yo hago en el codigo que publique recientemente parte el segundo byte al reves, es decir:

XXXX XXXX
XXXX XXXX
XXXX XXXX

pero ahora que tengo en claro como hacer operaciones con bits, solo queda modificar el codigo para leerlo de la manera correcta y arreglar mi funcion que lee la FAT. o sea

XXXX XXXX
XXXX XXXX
XXXX XXXX
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines