Java 位反转后的32位之和,最终结果从二进制变为十进制

Java 位反转后的32位之和,最终结果从二进制变为十进制,java,for-loop,int,Java,For Loop,Int,如果我的输入是1。那么1作为二进制中的32位是00000000000000000000000001。如果我反转这些位,其值为1111111111111111111111 0。如果我把这个倒过来的位数从二进制转换成十进制,我应该得到4294967294。我编写了下面的程序来实现这一点,但是我的最终总和是错误的,尽管我能够正确地反转位。我得了-3分 这是我的密码: public class FlippingBits { public static void main(String[] args)

如果我的输入是1。那么1作为二进制中的32位是00000000000000000000000001。如果我反转这些位,其值为1111111111111111111111 0。如果我把这个倒过来的位数从二进制转换成十进制,我应该得到4294967294。我编写了下面的程序来实现这一点,但是我的最终总和是错误的,尽管我能够正确地反转位。我得了-3分

这是我的密码:

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

}
公共类翻转位{
公共静态void main(字符串[]args){
FlippingBits fpb=新的FlippingBits();
int i=1;
int指数=0;
int[]位数组=新的int[32];
fpb.convertToBin(i,位数组,索引);
}
私有void convertToBin(整数十进制输入,整数[]无符号32,整数索引){
如果(十进制输入>1,无符号32,索引);
}
私有void sumBit(int[]unsigned32){
整数和=0;
for(int i=0;i

我不确定我的sumBit(int[])方法发生了什么。我很确定我没有忘记如何从二进制转换为十进制。

您实际上没有使用无符号整数。您的变量溢出。

这应该会有所帮助

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]);
    }
}
}
公共类翻转位{
公共静态void main(字符串[]args){
FlippingBits fpb=新的FlippingBits();
int i=1;
int指数=0;
int[]位数组=新的int[32];
fpb.convertToBin(i,位数组,索引);
}
私有void convertToBin(整数十进制输入,整数[]无符号32,整数索引){
如果(十进制输入>1,无符号32,索引);
}
私有void sumBit(int[]unsigned32){
长和=0;
对于(int i=unsigned32.length-1;i>=0;i--){
sum+=unsigned32[i]*(int)Math.pow(2,i);
}
系统输出打印项数(总和);
}
私有整数翻转位(整数余数){
如果(余数==1){
返回0;
}否则{
返回1;
}
}
私有void打印数组(int[]unsigned32){
对于(int i=unsigned32.length-1;i>=0;i--){
系统输出打印(未签名32[i]);
}
}
}

Java int数据类型是32位带符号的2的补码,有关更多信息,请参阅

我不想使用无符号的int。如何解决溢出问题?如果使用签名整数,则会出现溢出。没有解决方法。求和时使用long而不是int。这不是按位异或运算符吗?你需要仔细阅读。