비트 값이 1 인 위치 (32 비트 정수의 경우 0에서 31까지)가 연속 영역을 형성하는지 테스트해야합니다. 예를 들면 :
00111111000000000000000000000000 is contiguous
00111111000000000000000011000000 is not contiguous
이 테스트, 즉 일부 기능 has_contiguous_one_bits(int)
이 이식 가능하기를 바랍니다.
한 가지 분명한 방법은 위치를 반복하여 첫 번째 설정 비트를 찾은 다음 첫 번째 설정되지 않은 비트를 찾고 더 많은 설정 비트를 확인하는 것입니다.
더 빠른 방법이 있는지 궁금합니다. 최고 및 최저 세트 비트를 찾는 빠른 방법이있는 경우 (하지만 이 질문 에서 휴대용 비트 가없는 것으로 보입니다) 가능한 구현은 다음과 같습니다.
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);
}
재미를 위해 연속 비트가있는 처음 100 개의 정수가 있습니다.
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
그들은 (물론) (1<<m)*(1<<n-1)
음수가 아닌 형식 m
이며 n
.
0x0
컴팩트합니다. 그 반대 (간단하지 않음)를 정의하는 것이 더 쉽습니다. 설정 비트가있는 경우 그 사이에 설정되지 않은 비트가 하나 이상 있습니다.