Suppose we have int x = 371 , that is, in binary format 101110011 . I want to find the index of the most unrestored bit (in this case 7) and the index of the messiest bit (in this case 2). What is the most efficient way to do this?
Here is what I have:
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)); } }
If I'm not mistaken, my current implementation takes linear time. Can we do better?
source share