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)
| | |-+  ayuda. matriz binaria
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda. matriz binaria  (Leído 6,040 veces)
xBurninGx

Desconectado Desconectado

Mensajes: 10


Ver Perfil
ayuda. matriz binaria
« en: 14 Noviembre 2011, 03:19 am »

Hola,
    necesito crear una matriz eficiente que me marque según coordenadas X e Y si el valor almacenado es cierto o verdadero, y se me ha ocurrido hacer una matriz que en cada posición sólo contenga un bit, pero no se si eso se puede implementar, ya que sólo se me ocurre crear una matriz de char desperdiciando 7 bits por posición.

alguien me podría ayudar si ya se ha visto con el mismo problema?

muchas gracias de antemano.

Un saludo.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ayuda. matriz binaria
« Respuesta #1 en: 14 Noviembre 2011, 06:44 am »

Puedes utilizar un array de arrays de caracteres y utilizar cada uno de los bits del carácter para almacenar el estado (1/0 Verdadero/Falso). Así no habría desperdicio pero a cambio debes utilizar los operadores a nivel de bits para acceder y modificar el bit en cuestión.

¿Que lenguaje estas utilizando?

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: ayuda. matriz binaria
« Respuesta #2 en: 14 Noviembre 2011, 07:50 am »

.
De manera MASIVA TODOS los elementos de tu matrix OCUPAN TODOS LOS BITS?... si solo ocupan algunos (Pero siempre dejan desocupados uno o mas bits pues usa esos bits como tu campo de flags, pero esto seria muy cochino)..

o puedes declarar una estructura de este tipo.

Código
  1.  
  2. typedef struct StructData
  3. {
  4.    unsigned int uVal;
  5.    char cChar;
  6. } STRUCTDATA, *PSTRUCTDATA;
  7.  
  8.  

pero como te daras cuenta aun que si lo declaras una variable como char y suponiendo que unsigned int = 4 bytes y char = 1 byte es decir que la estructura pesara 5 bytes C dice que pesa 8 bytes (Se debe a la longitud de lectura de entero del procesador)...

Código
  1.  
  2. printf("SizeOf(STRUCTDATA) = %d\n", sizeof(STRUCTDATA));
  3.  
  4.  

Asi que mejor declarar los flags como int en lugar de char...

Código
  1.  
  2. typedef struct StructData
  3. {
  4.    unsigned int uVal;
  5.    int iFlags;
  6. } STRUCTDATA, *PSTRUCTDATA;
  7.  
  8.  

Dulces Lunas!¡.
« Última modificación: 14 Noviembre 2011, 07:52 am por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
xBurninGx

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: ayuda. matriz binaria
« Respuesta #3 en: 14 Noviembre 2011, 09:17 am »

rir3760 es una opción pero algo tediosa de implementar no? tendría que crearme un traductor de direcciones ya que al método se le pasaría la coordenada X e Y y la tendría que ubicar en el bit de un char de una fila determinada.. aunque se podría hacer.. si no hay nada mejor, creo que es la solución que menos espacio me ocuparía..
Por cierto, el lenguaje en el que lo implementaría es en c++

BlackZeroX la cuestión es ahorrar espacio.. con tu implementación por lo que entiendo, cada dato supone 8 B, 64 bits, siendo necesario nada más que un bit.. me sale más rentable la matriz de char que por lo menos cada dato me supone 1B..

gracias a los dos.
un saludo.
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: ayuda. matriz binaria
« Respuesta #4 en: 14 Noviembre 2011, 09:37 am »

¡Buenas!

Siempre podras transformar la matriz en un vector:

Matriz m x n ->vector[m x n]
Matriz(i,j) ->vector[i * n + j] (0<= i < m, 0 <= j < n)

Ahora dada una matriz m x n, te hara falta almacenar m x n bits. Tomaremos como unidad del vector el byte (char). Asi, tendras que crear un vector de (m x n) / 8 + ((m x n) % 8 ? 1 : 0) bytes para poder almacenar todos los bits que te hagan falta.

Para acceder al elemento i , j:

- Tendras que saber el byte en el que se encuentra = numero de bits / 8 = (i * n + j) / 8
- Tendras que desplazarte dentro de ese byte (i * n + j) - ((i * n + j) / 8) * 8 bits a la izquierda (los bits totales de la posicion que buscas menos los la cantidad de bits de los bytes anteriores).

Por lo tanto el elemento i , j sera: vector[(i * n + j) / 8] >> (i * n + j) - ((i * n + j) / 8) * 8

¡Saludos!

PD: Si me he confundido con los calculos avisad, que lo he hecho un poco al vuelo.

¡Saludos de nuevo!

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.


PD2: No me he dado cuenta de que lo he puesto mal.

Para saber el valor del bit tendras que hacer un and:
vector[(i * n + j) / 8] & (1 << 7 - ((i * n + j) - ((i * n + j) / 8) * 8))

para ponerlo a uno lo haces con un or:
vector[(i * n + j) / 8] | (1 << 7 - ((i * n + j) - ((i * n + j) / 8) * 8))

y para ponerlo a cero con xor (si no era cero, evidentemente, sino lo estarias poniendo a uno):
vector[(i * n + j) / 8] ^ (1 << 7 - ((i * n + j) - ((i * n + j) / 8) * 8))

Siempre podras ponerlo a cero de forma directa con la formula:
vector[(i * n + j) / 8] ^ (vector[(i * n + j) / 8] & (1 << 7 - ((i * n + j) - ((i * n + j) / 8) * 8)))

Ahora creo que esta bien.

La primera parte sirve solo para pensar un poco como hacerlo, pero esta mal. Lo dejo porque de los errores se aprende.

¡Saludos!
« Última modificación: 14 Noviembre 2011, 10:17 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
xBurninGx

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: ayuda. matriz binaria
« Respuesta #5 en: 14 Noviembre 2011, 09:48 am »

sii.. gracias a la primera respuesta estaba pensando en algo así.. pero no me había parado a pensar en los cálculos todavia..
muchas gracias!! estudiaré bien sus fórmulas, que de primeras da un poco de miedo, jeje.

un saludo
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: ayuda. matriz binaria
« Respuesta #6 en: 14 Noviembre 2011, 10:16 am »

BlackZeroX la cuestión es ahorrar espacio.. con tu implementación por lo que entiendo, cada dato supone 8 B, 64 bits, siendo necesario nada más que un bit.. me sale más rentable la matriz de char que por lo menos cada dato me supone 1B..

.
De manera MASIVA TODOS los elementos de tu matrix OCUPAN TODOS LOS BITS?... si solo ocupan algunos (Pero siempre dejan desocupados uno o mas bits pues usa esos bits como tu campo de flags, pero esto seria muy cochino)..

Por ejemplo si cada elemento no se ocupa el bit 30 de manera general y nunca se llegara a ocupar... pues ocupa este bit para saber esto... el valor cambiara pero se arregla con una mascara de bits...

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda en una matriz de 5*5 « 1 2 »
Programación C/C++
daxelmejor 11 7,389 Último mensaje 7 Mayo 2010, 21:30 pm
por Littlehorse
Duda - Buscar si existe una matriz dentro de otra matriz
Programación Visual Basic
EddyW 2 5,847 Último mensaje 14 Agosto 2010, 06:18 am
por EddyW
Matriz Dentro de otra matriz
Programación Visual Basic
moba741120 3 6,766 Último mensaje 13 Abril 2011, 18:29 pm
por raul338
ayuda en operacion con matriz
Programación C/C++
kiara_luna 2 2,649 Último mensaje 12 Septiembre 2011, 22:42 pm
por kiara_luna
[AYUDA][PYTHON] Como leo y escribo archivos en forma binaria
Scripting
Noxware 8 6,292 Último mensaje 24 Junio 2014, 19:40 pm
por daryo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines