Marat Dukhan | 2ab3ccb | 2017-04-16 08:46:37 -0400 | [diff] [blame] | 1 | #pragma once |
2 | |||||
3 | #include <stdint.h> | ||||
4 | |||||
5 | |||||
6 | inline static uint32_t bit_length(uint32_t n) { | ||||
7 | const uint32_t n_minus_1 = n - 1; | ||||
8 | if (n_minus_1 == 0) { | ||||
9 | return 0; | ||||
10 | } else { | ||||
Marat Dukhan | b2fc4ab | 2018-02-19 22:43:26 -0800 | [diff] [blame] | 11 | #ifdef _MSC_VER |
12 | unsigned long bsr; | ||||
13 | _BitScanReverse(&bsr, n_minus_1); | ||||
14 | return bsr + 1; | ||||
15 | #else | ||||
16 | return 32 - __builtin_clz(n_minus_1); | ||||
17 | #endif | ||||
Marat Dukhan | 2ab3ccb | 2017-04-16 08:46:37 -0400 | [diff] [blame] | 18 | } |
19 | } |