一尘不染

我如何获得钻头的位置

algorithm

我有一个十进制数字,我需要将其转换为二进制,然后在该二进制表示形式中找到一个的位置。

输入为5,其二进制为101,输出应为

1
3

下面是我的代码,仅提供输出,因为2我想提供二进制表示形式的位置。我还如何获得从1开始的设置位的位置?

public static void main(String args[]) throws Exception {
    System.out.println(countBits(5));
}

private static int countBits(int number) {
    boolean flag = false;

    if (number < 0) {
        flag = true;
        number = ~number;
    }
    int result = 0;
    while (number != 0) {
        result += number & 1;
        number = number >> 1;
    }
    return flag ? (32 - result) : result;
}

阅读 246

收藏
2020-07-28

共1个答案

一尘不染

你具有想法countBits返回而不是把一个结果,System.out.println里面的方法,通常是最好的办法。如果您希望它返回位位置列表,则类似的方法是让您的方法返回数组或某种类型的List,例如:

private static List<Integer> bitPositions(int number) {

正如我在评论中提到的那样,如果您使用>>>并摆脱了检查负数的特殊代码,将会使自己的生活变得更加轻松。这样做并改编您已有的代码,将为您提供类似

private static List<Integer> bitPositions(int number) {
    List<Integer> positions = new ArrayList<>();
    int position = 1;
    while (number != 0) {
        if (number & 1 != 0) {
            positions.add(position);
        }
        position++;
        number = number >>> 1;
    }
    return positions;
}

现在,呼叫者可以执行其想要打印出位置的操作。如果System.out.println在其上使用,输出将为[1, 3]。如果要将每个输出放在单独的行中:

for (Integer position : bitPositions(5)) {
     System.out.println(position);
}

无论如何,关于如何打印位置(或您要对其进行任何其他操作)的决定都与计算位置的逻辑保持分开,因为该方法返回整个列表,并且没有自己的println

(顺便说一句,正如亚历克斯所说,最常见的是将低阶位视为“ bit 0”而不是“ bit 1”,尽管我已经看过一些硬件手册将低阶位称为“ bit
31”以及高阶位“ bit 0”。将其称为“ bit 0”的好处是位置N的1位代表值2 N,这使事情变得简单。我的代码示例根据您的要求将其称为“ bit
1”在您的问题中;但是如果您想将其更改为0,则只需更改。的初始值即可position。)

2020-07-28