32 비트 부호없는 정수를 가정하십시오. 이 정수는 2의 거듭 제곱이라고 가정 할 수 있으므로 1 비트만 설정됩니다. 정수 비트를 제외한 모든 비트를 정수로 설정하려고합니다. 따라서 (간결을 위해 8 비트 정수를 사용) 00001000
은 11111000
이됩니다.먼저 '1'앞에 모든 비트를 설정하십시오.
이것은 물론 한 세트의 비트를 찾고 높은 비트를 반복하면서 그것들을 설정함으로써 달성 될 수 있습니다. 가장 높은 설정 비트의 위치 반환 highest_set
가정 :
uint32_t f(uint32_t x)
{
int n = highest_set(x);
for (int i = 31; i != n; --i) {
x |= 1 << i;
}
return x;
}
f
의 런타임 그러나 x
의 값에 따라 않는, 그리고 내가이 일을하는 영리한 방법이 있다고 생각합니다.
당신이 언급 한'~ (x - 1)'해결책은 아마도 현대의 어떤 것에 더 빠를 것입니다. 또한 적은 코드. – harold
@harold 동의 함. 나는 룩업 테이블에 대한 부분을 제거했다. 왜냐하면 대부분의 경우 실제 이점이 없기 때문에 더 복잡해 졌기 때문이다. – David