我有一个十进制数字,我需要将其转换为二进制,然后在该二进制表示形式中找到一个的位置。
输入为5,其二进制为101,输出应为
101
1 3
下面是我的代码,仅提供输出,因为2我想提供二进制表示形式的位置。我还如何获得从1开始的设置位的位置?
2
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; }
你具有想法countBits返回而不是把一个结果,System.out.println里面的方法,通常是最好的办法。如果您希望它返回位位置列表,则类似的方法是让您的方法返回数组或某种类型的List,例如:
countBits
System.out.println
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]。如果要将每个输出放在单独的行中:
[1, 3]
for (Integer position : bitPositions(5)) { System.out.println(position); }
无论如何,关于如何打印位置(或您要对其进行任何其他操作)的决定都与计算位置的逻辑保持分开,因为该方法返回整个列表,并且没有自己的println。
println
(顺便说一句,正如亚历克斯所说,最常见的是将低阶位视为“ bit 0”而不是“ bit 1”,尽管我已经看过一些硬件手册将低阶位称为“ bit 31”以及高阶位“ bit 0”。将其称为“ bit 0”的好处是位置N的1位代表值2 N,这使事情变得简单。我的代码示例根据您的要求将其称为“ bit 1”在您的问题中;但是如果您想将其更改为0,则只需更改。的初始值即可position。)
position