Tôi muốn tìm cách nhanh nhất để lấy chỉ mục của bit đặt hàng thấp nhất trong một thời gian dài. tức là:Chỉ số bit đặt hàng thấp nhất
00101001001000 -> 3
Các giải pháp liên quan đến chuyển mạch và dịch chuyển quá chậm. ví dụ:
int i;
if(bits == 0ULL) {
i = 64;
} else {
for(i = 0;!(bits & 1ULL);i++)
bits >>= 1;
}
EDIT: Thông tin về việc sử dụng
Chức năng sử dụng ffsll có thể không thực sự làm giảm việc sử dụng của nó, nhưng ở đây nó được (đơn giản hóa tất nhiên). Nó chỉ lặp lại thông qua các chỉ mục và làm điều gì đó với chúng. Chức năng này có lẽ là chức năng được sử dụng rộng rãi nhất trong toàn bộ ứng dụng của tôi mặc dù có rất nhiều bộ nhớ đệm về giá trị của nó. Đó là máy phát điện di chuyển hợp pháp trong công cụ tìm kiếm alpha-beta của tôi.
while(bits){
index = ffsll(bits);
doSomething(index);
index &= index-1;
}
Điều này có nghĩa là "quá chậm"? Phải mất bao nhiêu phần trăm trong toàn bộ thời gian chạy? – sambowry
mã này chạy trong 7,2 giây trong điểm chuẩn của tôi, nơi ffsll chạy trong 0,2 giây. đó là mức giảm 97%. quá chậm;) – dharga
Bản sao của http://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set –