查找设置位的索引

时间:2012-12-02 21:46:25

标签: java bit-manipulation

这可能很简单,但我对位操作不熟悉。我有一串位(比如警报字符串),我想查找其中所有1的索引号,以便我可以返回相关的警报或错误代码。例如,如果alarm_string = 1011000,那么我的方法应返回3,4和6。 我怎么能用位操作来做到这一点? 提前谢谢!

3 个答案:

答案 0 :(得分:1)

此方法应将您的位字段转换为设置位位置列表:

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

如果您的输入只是一个字符串,那么问题实际上是微不足道的。

List<Integer> setBits(String in) {
  final List<Integer> setBits = new ArrayList<>();
  for (int i = in.length()-1, j = 0; i >= 0; i--, j++)
    if (in.charAt(i) == '1') setBits.add(j);
  return setBits;
}

答案 1 :(得分:0)

BitSet在幕后做位操作。首先将String转换为BitSet。然后,使用nextSetBit查找1:

BitSet bs = new BitSet(inputString.length());

for (int i = 0; i < inputString.length(); ++i) {
  if (inputString[i] == '1') {
    bs.set(i);
  }
}

List<Integer> ones = new ArrayList<>();

 for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
     ones.add(i);
 }

return ones;

答案 2 :(得分:0)

String bits = "1011000";

List<Integer> indices = new ArrayList<Integer>();

for(int i = bits.lenght()-1; i>=0; i--){
   if(bits.charAt(i).equalsIgnorCase("1")){
      indices.add(bits.lenght()-i);
   }
}equalsIgnoreCase