elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 23:28  


Tema destacado: Grupo de Facebook de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  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 822 veces)
xBurninGx

Desconectado Desconectado

Mensajes: 10


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

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: 382


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

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

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


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

.
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
 
typedef struct StructData
{
   unsigned int uVal;
   char cChar;
} STRUCTDATA, *PSTRUCTDATA;
 
 

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
 
printf("SizeOf(STRUCTDATA) = %d\n", sizeof(STRUCTDATA));
 
 

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

Código
 
typedef struct StructData
{
   unsigned int uVal;
   int iFlags;
} STRUCTDATA, *PSTRUCTDATA;
 
 

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

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
xBurninGx

Desconectado Desconectado

Mensajes: 10


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

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: 604


Cuando me afeito, recuerdo porque me dejo barba.


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

¡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 por do-while » En línea

¡¡¡Feliz año nuevo!!!
xBurninGx

Desconectado Desconectado

Mensajes: 10


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

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 (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


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

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

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
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
Programación C/C++
daxelmejor 11 1,729 Último mensaje 7 Mayo 2010, 21:30
por Littlehorse
Duda - Buscar si existe una matriz dentro de otra matriz
Programación Visual Basic
EddyW 2 1,875 Último mensaje 14 Agosto 2010, 06:18
por EddyW
Matriz Dentro de otra matriz
Programación Visual Basic
moba741120 3 1,627 Último mensaje 13 Abril 2011, 18:29
por raul338
Ayuda Matriz java!
Java
fosh 3 1,449 Último mensaje 27 Abril 2011, 16:36
por fosh
ayuda en operacion con matriz
Programación C/C++
kiara_luna 2 657 Último mensaje 12 Septiembre 2011, 22:42
por kiara_luna
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines