es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Divide múltiples bytes según las máscaras de bits.

Estoy tratando de dividir bytes según máscaras de bits.

Considera estos dos bytes (1000 en binario como short int):

11101000

00000011

y estas tres máscaras:

00000011

11111111

00111111

Lo que quiero hacer es dividir los dos bytes originales en tres bytes según las máscaras proporcionadas.

El resultado debería ser:

00000000 para el primer byte

11111010 para el segundo (los bytes originales 1 y 2 se fusionan debido a la máscara)

00000000 para el tercero (los bits restantes se llenan con ceros)

¿Cuál es la forma más sencilla de hacerlo en Java o C?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para dividir bytes según máscaras de bits en Java, puedes usar los operadores de AND(&) y desplazamiento de bits(>>). Aquí hay una forma de lograr el resultado deseado:

    short byte1 = (short) 0b11101000;
    short byte2 = (short) 0b00000011;
    short[] masks = {0b00000011, 0b11111111, 0b00111111};
    
    byte[] result = new byte[3];
    for (int i = 0; i < masks.length; i++) {
        int shift = 8 - Integer.bitCount(masks[i]); // calcular el número de ceros para desplazar
        result[i] = (byte) ((masks[i] & byte1) << shift | (masks[i] & byte2) >> (8 - shift));
    }
    

    Aquí, primero definimos los bytes de entrada y las tres máscaras como shorts. Luego creamos un arreglo de bytes para almacenar el resultado de la operación de división.

    Usamos un bucle para iterar a través del arreglo de máscaras. Para cada máscara, calculamos el número de ceros a desplazar restando el número de unos en la máscara de 8 (ya que estamos tratando con bytes de 8 bits). Luego aplicamos la máscara a ambos bytes de entrada usando el operador de AND bitwise.

    Desplazamos el resultado del primer byte hacia la izquierda usando el valor de desplazamiento calculado, y desplazamos el resultado del segundo byte hacia la derecha por la diferencia entre 8 y el valor de desplazamiento. Luego combinamos los bytes desplazados usando el operador de OR bitwise, y convertimos el resultado a byte para almacenarlo en el arreglo de salida.

    Para lograr lo mismo en C, también puedes usar los operadores de AND bitwise(&) y desplazamiento de bits(>>). Aquí tienes un ejemplo:

    unsigned char byte1 = 0b11101000;
    unsigned char byte2 = 0b00000011;
    unsigned char masks[] = {0b00000011, 0b11111111, 0b00111111};
    unsigned char result[3];
    
    for (int i = 0; i < 3; i++) {
        int shift = 8 - __builtin_popcount(masks[i]); // calcular el número de ceros para desplazar
        result[i] = ((masks[i] & byte1) << shift) | ((masks[i] & byte2) >> (8 - shift));
    }
    

    Aquí, definimos los bytes de entrada y las tres máscaras como unsigned chars. Creamos un arreglo para almacenar los bytes de salida.

    Usamos un bucle para iterar a través del arreglo de máscaras. Para cada máscara, calculamos el número de ceros a desplazar restando el número de unos en la máscara de 8. Aplicamos la máscara a ambos bytes de entrada usando el operador de AND bitwise.

    Desplazamos el resultado del primer byte hacia la izquierda usando el valor de desplazamiento calculado, y desplazamos el resultado del segundo byte hacia la derecha por la diferencia entre 8 y el valor de desplazamiento. Luego combinamos los bytes desplazados usando el operador de OR bitwise, y almacenamos el resultado en el arreglo de salida.

Comments are closed.