我怎样才能得到位的位置
我有一个十进制数,我需要转换为二进制,然后在二进制表示中找到一个的位置。
输入为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 > 1; } return flag ? (32 - result) : result; }
您countBits
返回结果,而不是将System.out.println
放在方法中,这通常是最好的方法。 如果你想要它返回一个位位置列表,那么模拟将是你的方法返回一个数组或某种List,如:
private static List bitPositions(int number) {
正如我在评论中提到的,如果您使用>>>
并删除特殊代码来检查否定,您将使自己的生活更轻松。 这样做,并调整你已有的代码,给你一些类似的东西
private static List bitPositions(int number) { List 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
。
(顺便说一句,正如亚历克斯所说,最常见的是将低阶位视为“位0”而不是“位1”,尽管我已经看到将低位称为“位31”的硬件手册将其命名为“位0”的优点是位置N中的1位表示值2 N ,这使得事情变得简单。我的代码示例将其称为“位1”,如您所要求的那样在您的问题中;但如果您想将其更改为0,只需更改position
的初始值。)
您需要跟踪您所处的位置,当number & 1
结果为1时,打印出该位置。 它看起来像:
... int position = 1; while (number != 0) { if((number & 1)==1) System.out.println(position); result += number & 1; position += 1; number = number >> 1; } ...
二进制表示:您的数字与现代(非量子)计算机上的任何内容一样,已经是内存中的二进制表示forms,作为给定大小的位序列。
位操作您可以使用位移位,位屏蔽,“AND”,“OR”,“NOT”和“XOR” 按位操作来操作它们,并在各个位的级别上获取有关它们的信息。
你的榜样
对于您的示例数字5(101),您提到您的预期输出将为1, 3
。 这有点奇怪,因为一般来说,一个将从0开始计数,例如5为一个byte
(8位数):
76543210 <-- bit index 5 00000101
所以我希望输出为0
和2
因为这些位索引的位设置为( 1
)。
您的示例实现显示了该函数的代码
private static int countBits(int number)
它的名称和签名意味着任何实现的以下行为:
- 它采用整数值
number
并返回单个输出值。 - 它旨在计算输入
number
中设置的number
。
即它与您描述的预期function完全不匹配。
一个办法
您可以结合使用“位移”( >>
)和AND
( &
)操作来解决问题。
int index = 0; // start at bit index 0 while (inputNumber != 0) { // If the number is 0, no bits are set // check if the bit at the current index 0 is set if ((inputNumber & 1) == 1) System.out.println(index); // it is, print its bit index. // advance to the next bit position to check inputNumber = inputNumber >> 1; // shift all bits one position to the right index = index + 1; // so we are now looking at the next index. }
如果我们为您的示例输入数字'5'运行此操作,我们将看到以下内容:
iteration input 76543210 index result 1 5 00000101 0 1 => bit set. 2 2 00000010 1 0 => bit not set. 3 1 00000001 2 1 => bit set. 4 0 00000000 3 Stop, because inputNumber is 0
有一种方法可以使用逐位操作来解决您的问题。
Integer.toBinaryString(int number)
将整数转换为由0和1组成的String。 这在你的情况下很方便,因为你可以改为:
public static void main(String args[]) throws Exception { countBits(5); } public static void countBits(int x) { String binaryStr = Integer.toBinaryString(x); int length = binaryStr.length(); for(int i=0; i
它绕过了你可能想要做的事情(在Java中学习按位操作),但在我看来使代码看起来更清晰。
Integer.lowestOneBit和Integer.numberOfTrailingZeros的组合立即给出最低1位的位置,如果数字为0,则返回32。
因此,以下代码按升序返回数字编号的1位位置:
public static List BitOccurencesAscending(int number) { LinkedList out = new LinkedList<>(); int x = number; while(number>0) { x = Integer.lowestOneBit(number); number -= x; x = Integer.numberOfTrailingZeros(x); out.add(x); } return out; }