comparaciones de bits

ant32
01 de Enero del 2010
Hola a todos, agradecería un poco de ayuda con este problema de C que se me plantea. Es un problema de compresión de datos. Tengo el codigo más o menos echo pero tengo una parte donde tengo que ir comparando datos de una matriz cuadrada (unos y ceros) almacenados en tablas bidimensionales y almacenar esos datos en una tabla unidimensional. A su vez tengo que ir comparando los bits por pares de dos en dos y asignarles un valor (-1 para los ceros y 1 para los 1), por ejemplo supongamos que tengo esta primera fila de la matriz 000111, se cogería el primer par (00) y se le asignaría un -2 al ser ceros (-1-1=-2), el segundo par como no son iguales (01) sería -1 para el 0 y 1 para el 1, el tercer par al ser iguales (11) sería un 2 (1+1=2), quedando como resultado la tabla unidimensional -2 -1 1 2. Muchas gracias de antemano a todos.

Sircoko
01 de Enero del 2010
Hola,
Supongo que habrá millones de maneras de resolver este problema y, con alta probabilidad, la soluciòn que te voy a presentar puede no ser la mas eficiente. Aun así, pienso que te podría a ayudar a pensar en lo basico.
Tienes varios elementos, Una matriz cuadrada (y de tamaño par). Un indicador de que has leido dos datos nada mas, y contadores para el recorrido de la matriz.

sabes que las columnas de una matriz MxM van de [0,M-1]
por lo tanto si recorres la matriz por filas, un buen indicador de que has recorrido dos espacios seria que el contador de columnas sea impar. en ese caso, te tocaria reasignar los valores correspondientes a cada uno, sumarlos y guardarlos en una segunda matriz.

Otra manera, pudiera ser transformar directamente toda la matriz a -1 y 1 y luego recorrer de dos en dos simplemente sumando...

Un algoritmo podria ser:

contadores enteros: i,j
variables temporales: valor1, valor2
Matriz[MxM]: Matrizinicial
Matriz[MxM]: Matriztransformada
Vector[(M.M)/2]: vector final


precondicion: La matriz inicial debe estar llena con 0's y 1's
M=tamaño de matriz cuadrada y par
i,j,k =0 //contadores
mientras(i<M)
{
mientras(j<M)
{
si( Matrizinicial[i,j]==0 )
Matriztransformada[i,j]=-1
sino
Matriztransformada[i,j]=1
}
} //hasta aqui, se ha llenado la matriz transformada

//ahora agrupando de dos en dos

i,j=0
mientras(i<M)
{
mientras(j<M)
{
si (j mod 2 != 0) //numero impar
{
valor1=Matriztransformada[i,j-1]
valor2=Matriztransformada[i,j]
vector[k] = valor1+valor2
}
}
}

sircoko
01 de Enero del 2010
cosa que se me olvido, al final luego de asignar el valor al vector, debes incrementar la K (que indica la posicion de la casilla a ser llenada en el vector)

Suerte, espero que te sirva como ayuda

ant32
01 de Enero del 2010
Muchas gracias sircoko, es exactamente lo que necesitaba.