Browse Source Download (without any required ccan dependencies)

### Module:

ilog

### Summary:

Integer logarithm.

### Author:

Timothy B. Terriberry <tterribe@xiph.org>

### Dependencies:

### Description:

ilog_32() and ilog_64() compute the minimum number of bits required to store
an unsigned 32-bit or 64-bit value without any leading zero bits.

This can also be thought of as the location of the highest set bit, with
counting starting from one (so that 0 returns 0, 1 returns 1, and 2**31
returns 32).

When the value is known to be non-zero ilog32_nz() and ilog64_nz() can
compile into as few as two instructions, one of which may get optimized out
later.

STATIC_ILOG_32 and STATIC_ILOG_64 allow computation on compile-time
constants, so other compile-time constants can be derived from them.

### Example:

```
#include <stdio.h>
#include <limits.h>
#include <ccan/ilog/ilog.h>
int main(void){
int i;
printf("ilog32(0x%08X)=%i\n",0,ilog32(0));
for(i=1;i<=STATIC_ILOG_32(USHRT_MAX);i++){
uint32_t v;
v=(uint32_t)1U<<(i-1);
//Here we know v is non-zero, so we can use ilog32_nz().
printf("ilog32(0x%08X)=%i\n",v,ilog32_nz(v));
}
return 0;
}
```

### License:

CC0 (Public domain)