1*2b54f0dbSXin Li #pragma once 2*2b54f0dbSXin Li 3*2b54f0dbSXin Li #include <stdint.h> 4*2b54f0dbSXin Li 5*2b54f0dbSXin Li bit_length(uint32_t n)6*2b54f0dbSXin Liinline static uint32_t bit_length(uint32_t n) { 7*2b54f0dbSXin Li const uint32_t n_minus_1 = n - 1; 8*2b54f0dbSXin Li if (n_minus_1 == 0) { 9*2b54f0dbSXin Li return 0; 10*2b54f0dbSXin Li } else { 11*2b54f0dbSXin Li #ifdef _MSC_VER 12*2b54f0dbSXin Li unsigned long bsr; 13*2b54f0dbSXin Li _BitScanReverse(&bsr, n_minus_1); 14*2b54f0dbSXin Li return bsr + 1; 15*2b54f0dbSXin Li #else 16*2b54f0dbSXin Li return 32 - __builtin_clz(n_minus_1); 17*2b54f0dbSXin Li #endif 18*2b54f0dbSXin Li } 19*2b54f0dbSXin Li } 20