Каков наиболее эффективный способ найти индекс самого левого / самого правого неустановленного бита в Java?

Предположим, что у нас есть int x = 371 , что находится в двоичном формате 101110011 . Я хочу найти индекс самого левого неустановленного бита (в данном случае 7) и индекс самого правого неустановленного бита (в данном случае 2). Что самый эффективный способ сделать это?

Вот что у меня есть:

public class BitOperatons {

    public static int setBit(int x, int i) {
        int y = x | (1 << i);
        return y;
    }

    public static boolean isBitSet(int x, int i) {
        int y = setBit(0, i);
        return y == (x & y);
    }    

    public static int findLeftMostSetBit(int x) {
        for (int i = 31; i >= 0; i--) {
            if (isBitSet(x, i))
                return i;
        }
        return -1;
    }

    public static int findRightMostUnsetBit(int x) {
        for (int i = 0; i <= 31; i++) {
            if (! isBitSet(x, i))
                return i;
        }
        return -1;
    }

    public static int findLeftMostUnsetBit(int x) {
        int k = findLeftMostSetBit(x);
        for (int i = k; i >= 0; i--) {
            if (! isBitSet(x, i))
                return i;
        }
        return -1;
    }

    public static1+ void main(String[] args) {
        int x = 
            (1 << 0) |
            (1 << 1) |
            (1 << 4) |
            (1 << 5) |
            (1 << 6) |
            (1 << 8);
        System.out.println(findLeftMostUnsetBit(x));
        System.out.println(findRightMostUnsetBit(x));
    }

}

Если я не ошибаюсь, мой текущий реализация занимает линейное время. Можем ли мы сделать лучше?

6
задан MarcoS 27 June 2011 в 16:06
поделиться