在Java中,如何以整数的反向二进制形式获取1的位置?

2022-08-31 17:04:20

我有一个遗留应用程序,它采用整数,将其转换为二进制字符串,反转该字符串,然后将位(一)的位置作为整数列表获取。例如:

6 -> "110" -> "011" -> (2,3) 
7 -> "111" -> "111" -> (1,2,3)
8 -> "1000" -> "0001" -> (4)

在没有字符串操作的现代Java中实现这一点的简洁明了的方法是什么?往返于 String 的转换对我来说似乎是浪费的,而且我知道无论如何都没有简单的方法来翻转 String (no )。String.reverse()


答案 1

只需依次检查位:

List<Integer> bits(int num) {
  List<Integer> setBits = new ArrayList<>();
  for (int i = 1; num != 0; ++i, num >>>= 1) {
    if ((num & 1) != 0) setBits.add(i);
  }
  return setBits;
}

在线演示

6 [2, 3]
7 [1, 2, 3]
8 [4]

答案 2

您可以只测试位,而无需将整数转换为字符串:

List<Integer> onePositions(int input) {
  List<Integer> onePositions = new ArrayList<>();
  for (int bit = 0; bit < 32; bit++) {
    if (input & (1 << bit) != 0) {
      onePositions.add(bit + 1); // One-based, for better or worse.
    }
  }
  return onePositions;
}

位通常从右到左计数,最右边的位是位0。该操作将为您提供一个,其编号位设置为 1(其余设置为 0)。然后使用 (二进制 and) 检查此位是否在 中设置,如果是,则在输出数组中记录位置。1 << bitintbit&input


推荐