十进制转二进制转换

4

我想将十进制数转换为二进制数,并将它们存储在一个数组中。首先,我需要创建一个具有一定长度的数组,以便可以存储二进制数。之后,我执行转换操作,以下是我的方法:

public class Aufg3 {
    public static void main(String[] args) {
        int[] test = decToBin(12, getBinArray(12));
        for(int i = 0; i < test.length; i++){
            System.out.println(test[i]);
        }
    }

    public static int[] getBinArray(int number){
        int res = number, length = 0;
        while(res != 0){        
            res /= 2;
                    length++;
        }
        return new int[length];
    }

    public static int[] decToBin(int number, int[] array){
        int res = number, k = array.length-1;
        while(res != 0){
            if(res%2 == 0){
                array[k] = 0;
            }else{
                array[k] = 1;
            }
            k--;
            res /= 2;
        }
        return array;
    }
}

有什么需要改进的吗?输入12应该输出1100。

1
这是作业吗?如果是的话,你应该标记它。 - Jim Garrison
@Jim: "The homework tag...is now discouraged," 但是,@ArtWorkAD,请(像往常一样)遵循通用指南:说明任何特殊限制,展示你已经尝试过的内容,并询问具体什么让你感到困惑。 - Roger Pate
4个回答

6

为什么不直接使用 Integer 类的 toBinaryString 方法:

System.out.println(Integer.toBinaryString(12))

2
我不知道那个方法。那比我的建议更好。 - nojo

3
我猜想您想编写自己的代码,否则使用标准Java库中的方法可以轻松完成此任务。
以下是一些快速评论:
  • 您可以摆脱res临时变量。直接使用number进行运算(请记住Java按值传递参数)。
  • 移位比除法更有效率(用number >>>= 1代替number /= 2),尽管编译器应该能够优化这一点。
  • 如果只是这样做:array[k] = number & 1;,则可以避免在decToBin中使用模数。
  • 趁着机会,为什么不直接从decToBin调用getBinArray呢?然后您只需调用带有一个参数(要转换的值)的decToBin
以下是稍微优化过的版本:
public static int[] getBinArray(int number) {
    int length = 0;
    while (number != 0) {
        number >>>= 1;
        length++;
    }
    return new int[length];
}

public static int[] decToBin(int number) {
    int[] array = getBinArray(number);
    int k = array.length-1;
    while (number != 0)
    {
        array[k--] = number & 1;
        number >>>= 1;
    }
    return array;
}

你能描述一下移位运算符吗? - DarkLeafyGreen
2
@ArtWorkAD:逻辑右移运算符“>>>”将操作数中的所有位向右移动指定数量的位置,插入必要的零位以填充左侧的空位。因此,“number >>> = 1”将所有位向右移动一位,并在MSB处插入一个零位。参见:http://en.wikipedia.org/wiki/Logical_shift - Grodriguez
谢谢,那么array[k--] = number & 1是什么意思?问号是什么意思? - DarkLeafyGreen
@ArtWorkAD:请注意,这里使用逻辑右移(>>>)而不是算术右移(>>)。算术右移会保留符号位,因此您永远无法达到循环终止条件(number 达到零)。 - Grodriguez
@ArtWorkAD:这不是一个?,而是一个&。这是按位与运算符。表达式number & 1仅保留number的最低有效位。如果数字为奇数,则此位将为1,如果为偶数,则为0。 - Grodriguez

2
如果这不是作业,就没必要自己动手了。以下代码应该可以正常工作:
BigInteger bigInt = new BigInteger(number);
String asString = bigInt.toString(2);

可能有更高效的方法,但这种方式肯定非常易读和易于维护。


1

有一些小的地方可以改进:

  • 您应该定义一个“高级”方法,将int转换为int[]。在当前代码中,您必须两次提到12,这是不好的。
  • 您应该使用do { ... } while (number != 0)循环。否则,数字0将被表示为空数组。
  • 您应该使用x >>> 1而不是x / 2,因为它可以正确处理负数。
  • 如果您想要检查代码是否正确,请编写另一个方法,将二进制转换回int。然后,您可以检查binToDec(decToBin(12, ...)) == 12
  • getBinArray方法不应该是public,因为它只是一个辅助方法。您可以将public替换为private,或者只是删除public

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接