Si mi entrada es 1. Entonces 1 como 32 bits en binario es 00000000000000000000000000000001. Si invierto los bits, es 111111111111111111111111111110. Y si convierto este número de bit invertido de binario a decimal, debería obtener 4294967294. Escribí el siguiente programa para hacer esto, pero mi suma final es incorrecta a pesar de que puedo invertir los bits correctamente. Estoy obteniendo -3.

Aquí está mi código:

public class FlippingBits {

public static void main(String[] args) {
    FlippingBits fpb = new FlippingBits();
    int i = 1;
    int index = 0;
    int[] bitArray = new int[32];
    fpb.convertToBin(i, bitArray, index);
}

private void convertToBin(int decimalInput, int[] unsigned32, int index) {
    if (decimalInput <= 1) {
        unsigned32[index++] = flipBit(decimalInput);
        for (int i = index; i < unsigned32.length; i++) {
            unsigned32[i] = 1;
        }
        printArray(unsigned32);
        System.out.println();
        sumBit(unsigned32);
        return;
    }
    int remainder = decimalInput % 2;
    unsigned32[index] = flipBit(remainder);
    index++;
    convertToBin(decimalInput >> 1, unsigned32, index);
}

private void sumBit(int[] unsigned32) {
    int sum = 0;
    for (int i = 0; i < unsigned32.length; i++) {
        sum += unsigned32[i] * (int) Math.pow(2, i);
    }
    System.out.println(sum);
}

private int flipBit(int remainder) {
    if (remainder == 1) {
        return 0;
    } else {
        return 1;
    }
}

private void printArray(int[] unsigned32) {
    for (int i = 0; i < unsigned32.length; i++) {
        System.out.print(unsigned32[i]);
    }
}

}

No estoy seguro de qué está pasando con mi método sumBit (int []). Estoy bastante seguro de que no he olvidado cómo convertir de binario a decimal.

1
MMP 24 ene. 2015 a las 06:33

3 respuestas

La mejor respuesta

En realidad, no estás usando entradas sin firmar. Estás desbordando tu variable.

1
Kennedy Bushnell 24 ene. 2015 a las 03:40

El tipo de datos Java int es un complemento a dos con signo de 32 bits; consulte http://www.cs.uwm.edu/~cs151/Bacon/Lecture/HTML/ch03s09.html para obtener más información

1
Evgeniy Dorofeev 24 ene. 2015 a las 04:22

Esto debería ayudar

public class FlippingBits {

public static void main(String[] args) {
    FlippingBits fpb = new FlippingBits();
    int i = 1;
    int index = 0;
    int[] bitArray = new int[32];
    fpb.convertToBin(i, bitArray, index);
}

private void convertToBin(int decimalInput, int[] unsigned32, int index) {
    if (decimalInput <= 1) {
        unsigned32[index++] = flipBit(decimalInput);
        for (int i = index; i < unsigned32.length; i++) {
            unsigned32[i] = 1;
        }
        printArray(unsigned32);
        System.out.println();
        sumBit(unsigned32);
        return;
    }
    int remainder = decimalInput % 2;
    unsigned32[index] = flipBit(remainder);
    index++;
    convertToBin(decimalInput >> 1, unsigned32, index);
}

private void sumBit(int[] unsigned32) {
    long sum = 0;
    for (int i = unsigned32.length - 1; i >= 0; i--) {
        sum += unsigned32[i] * (int) Math.pow(2, i);
    }
    System.out.println(sum);
}

private int flipBit(int remainder) {
    if (remainder == 1) {
        return 0;
    } else {
        return 1;
    }
}

private void printArray(int[] unsigned32) {
    for (int i = unsigned32.length - 1; i >= 0; i--) {
        System.out.print(unsigned32[i]);
    }
}
}
1
Shiv 24 ene. 2015 a las 03:51