2015-01-24 1 views
1

Если мой вход равен 1. Затем 1, как 32 бита в двоичном формате, - 00000000000000000000000000000001. Если я инвертирую биты, его 1111111111111111111111111111111110. И если я конвертирую этот инвертированный бит число от двоичного до десятичного, я должен получить 4294967294. Я написал следующую программу для этого, но моя последняя сумма ошибочна, несмотря на то, что я могу правильно инвертировать биты. Я получаю -3.Сумма из 32 бит после инвертирования бит, конечный результат от двоичного до десятичного.

Вот мой код:

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]); 
    } 
} 

} 

Я не уверен, что происходит с моим заполнив ([] INT) метод. Я уверен, что не забыл, как конвертировать из двоичного в десятичный.

+0

Вы должны прочитать на [двоичное дополнение] (HTTP: // en.wikipedia.org/wiki/Two%27s_complement). – Jared

ответ

1

Вы фактически не используете неподписанные ints. Вы переполняете свою переменную.

+0

Я не пытаюсь использовать unsigned ints. Как исправить проблему переполнения? – MMP

+1

, если вы используете подписанные ints, у вас есть переполнение. нет обходного пути. – JustKevin

+0

Когда вы суммируете, используйте long вместо int. –

1

Это должно помочь

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]); 
    } 
} 
}