Tôi cần kiểm tra xem các vị trí (từ 0 đến 31 đối với số nguyên 32 bit) với giá trị bit 1 có tạo thành vùng liền kề hay không. Ví dụ:
00111111000000000000000000000000 is contiguous
00111111000000000000000011000000 is not contiguous
Tôi muốn bài kiểm tra này, tức là một số chức năng has_contiguous_one_bits(int)
, có thể di động được.
Một cách rõ ràng là lặp qua các vị trí để tìm bit đặt đầu tiên, sau đó là bit không đặt đầu tiên và kiểm tra xem có thêm bit nào không.
Tôi tự hỏi liệu có tồn tại một cách nhanh hơn không? Nếu có các phương pháp nhanh chóng để tìm các bit đặt cao nhất và thấp nhất (nhưng từ câu hỏi này, có vẻ như không có bất kỳ phương pháp di động nào), thì một cách triển khai khả thi là
bool has_contiguous_one_bits(int val)
{
auto h = highest_set_bit(val);
auto l = lowest_set_bit(val);
return val == (((1 << (h-l+1))-1)<<l);
}
Vui vẻ thôi, đây là 100 số nguyên đầu tiên có các bit liền nhau:
0 1 2 3 4 6 7 8 12 14 15 16 24 28 30 31 32 48 56 60 62 63 64 96 112 120 124 126 127 128 192 224 240 248 252 254 255 256 384 448 480 496 504 508 510 511 512 768 896 960 992 1008 1016 1020 1022 1023 1024 1536 1792 1920 1984 2016 2032 2040 2044 2046 2047 2048 3072 3584 3840 3968 4032 4064 4080 4088 4092 4094 4095 4096 6144 7168 7680 7936 8064 8128 8160 8176 8184 8188 8190 8191 8192 12288 14336 15360 15872 16128 16256 16320
chúng (tất nhiên) có dạng (1<<m)*(1<<n-1)
không phủ định m
và n
.
0x0
nhỏ gọn. Sẽ dễ dàng hơn để xác định điều ngược lại (không gọn nhẹ): nếu có các bit đặt wo như vậy thì có ít nhất một bit chưa được đặt giữa chúng.