Giả sử rằng chúng tôi có int x = 371
, có định dạng nhị phân 101110011
. Tôi muốn tìm chỉ mục của bit không được đặt nhiều nhất bên trái (trong trường hợp này là 7) và chỉ mục của bit không được đặt nhiều nhất bên phải (trong trường hợp này là 2). Cách hiệu quả nhất để làm điều đó là gì?Cách hiệu quả nhất để tìm kiếm chỉ mục của bit không được đặt bên trái/bên phải nhiều nhất trong Java là gì?
Dưới đây là những gì tôi có:
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));
}
}
Nếu tôi không sai, thực hiện hiện tại của tôi cần có thời gian tuyến tính. Chúng ta có thể làm tốt hơn không?
Không thể làm tốt hơn tuyến tính. – toto2
@toto, điều này là không đúng, doh quên, nhìn vào Delight Delight 5-3 (ví dụ) (số 0 đứng đầu, là một phần của Integer.class) – bestsss
@bestsss, OK nếu bạn có nghĩa là hướng dẫn máy theo đề xuất của flolo. Nếu bạn biết về một bản ngã phụ tuyến tính, tôi muốn biết. – toto2