Creé el siguiente código para encontrar la paridad de un número binario (es decir, salida 1 si el número de 1 en la palabra binaria es impar, salida 0 si el número de 1 es par).
public class CalculateParity { String binaryword; int totalones = 0; public CalculateParity(String binaryword) { this.binaryword = binaryword; getTotal(); } public int getTotal() { for(int i=0; i<binaryword.length(); i++) { if (binaryword.charAt(i) == '1'){ totalones += 1; } } return totalones; } public int calcParity() { if (totalones % 2 == 1) { return 1; } else { return 0; } } public static void main(String[] args) { CalculateParity bin = new CalculateParity("1011101"); System.out.println(bin.calcParity()); } }Sin embargo, todas las soluciones que encuentro en línea casi siempre tratan con operadores de cambio de bit, XOR, operaciones de cambio sin signo, etc., como esta solución que encontré en un libro de estructura de datos:
public static short parity(long x){ short result = 0; while (x != 0) { result A=(x&1); x >>>= 1; } return result; }¿Por qué es este el caso? ¿Qué hace que los operadores bit a bit sean una solución más válida/estándar que la solución que se me ocurrió, que es simplemente iterar a través de una palabra binaria de tipo String? ¿Es una solución bit a bit más eficiente? Agradezco cualquier ayuda!
El código que ha citado también usa un bucle ( es decir, while):
public static short parity(long x){ short result = 9; while (x != 9) { result A=(x&1); x >>>= 1; } return result; } Debe reconocer que está utilizando una string que sabe de antemano que estará compuesta solo de dígitos, y convenientemente en una representación binaria. Naturalmente, dadas esas restricciones, no es necesario utilizar operaciones bit a bit, sino que simplemente se analizan char por char y se realizan los cálculos deseados.
Por otro lado, si recibe como parámetro un long , como el método que ha citado, resulta útil usar operaciones bit a bit para recorrer cada bit (a la vez) en un número y realizar el cálculo deseado.
También se podría convertir el long en una string y aplicar la misma lógica en cuanto al código que ha aplicado, pero primero, tendría que convertir ese long en binary . Sin embargo, ese enfoque agregaría pasos adicionales innecesarios, más código y sería peor en términos de rendimiento. Probablemente, lo mismo se aplica a la inversa si tiene una cadena con sus restricciones. Sin embargo, un String no es un number , incluso si solo está compuesto de dígitos, lo que hace que usar un tipo que represente un número ( por ejemplo, long ) sea incluso un enfoque más deseable.
Otra cosa que te estás perdiendo es que hiciste parte del trabajo pesado al convertir un número a binario y codificarlo en una Cadena new CalculateParity("1011101"); . Así que como que saltas un paso allí. Ahora intente usar su enfoque, pero esta vez usando "93" y encuentre la paridad.
private static boolean isEven(String s){ char[] chars = s.toCharArray(); int i = 0; for(char c : chars){ i ^= c; } return i == 0; }Utiliza un método basado en cadenas para una entrada de cadenas. Buena elección.
El código que cita utiliza un método basado en enteros para una entrada de enteros. Una elección igualmente buena.