chess:programming:msb_most_significant_bit
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
chess:programming:msb_most_significant_bit [2021/10/30 12:12] – peter | chess:programming:msb_most_significant_bit [2021/10/30 12:29] (current) – [Using Built-in for GCC] peter | ||
---|---|---|---|
Line 34: | Line 34: | ||
return r + bval[x]; | return r + bval[x]; | ||
} | } | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ===== Using Built-in for GCC ===== | ||
+ | |||
+ | <code cpp> | ||
+ | unsigned BSR64(uint64_t x) | ||
+ | { | ||
+ | return 63-__builtin_clzll(x); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <WRAP info> | ||
+ | **NOTE: | ||
+ | |||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | |||
+ | |||
+ | * The returned value is undefined for 0 inputs. | ||
+ | * See https:// | ||
+ | |||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ===== Using Built-in for Microsoft Compiler ===== | ||
+ | |||
+ | <code cpp> | ||
+ | #ifdef MICROSOFT_COMPILER | ||
+ | u32 msbNative32(u32 val) | ||
+ | { | ||
+ | unsigned long result; | ||
+ | _BitScanReverse(& | ||
+ | return result; | ||
+ | } | ||
+ | |||
+ | u32 msbNative64(u64 val) | ||
+ | { | ||
+ | unsigned long result; | ||
+ | _BitScanReverse64(& | ||
+ | return result; | ||
+ | } | ||
+ | #endif // MICROSOFT_COMPILER | ||
</ | </ | ||
Line 40: | Line 86: | ||
===== Using de Bruijn for 32-bit ===== | ===== Using de Bruijn for 32-bit ===== | ||
+ | <code cpp> | ||
u32 msbDeBruijn32(u32 v) | u32 msbDeBruijn32(u32 v) | ||
{ | { | ||
Line 65: | Line 112: | ||
</ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ===== Using a Loop ===== | ||
+ | |||
+ | <code cpp> | ||
+ | unsigned int msbLoop32(u32 x) | ||
+ | { | ||
+ | int r = 0; | ||
+ | if (x < 1) return 0; | ||
+ | while (x >>= 1) r++; | ||
+ | return r; | ||
+ | } | ||
+ | |||
+ | unsigned int msbLoop64(u64 x) | ||
+ | { | ||
+ | int r = 0; | ||
+ | if (x < 1) return 0; | ||
+ | while (x >>= 1) r++; | ||
+ | return r; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <WRAP info> | ||
+ | **NOTE: | ||
+ | </ | ||
+ | |||
---- | ---- | ||
Line 72: | Line 146: | ||
<code cpp> | <code cpp> | ||
#include < | #include < | ||
+ | unsigned BSR32(unsigned long x) | ||
+ | { | ||
+ | bsr_idx_t idx; | ||
+ | _BitScanReverse(& | ||
+ | return idx; | ||
+ | } | ||
- | unsigned | + | unsigned |
- | unsigned long * Index, | + | { |
- | unsigned long Mask | + | |
- | ); | + | |
- | unsigned char _BitScanForward64( | + | |
- | | + | } |
- | unsigned __int64 Mask | + | |
- | ); | + | |
</ | </ | ||
Line 88: | Line 166: | ||
https:// | https:// | ||
+ | |||
+ | http:// | ||
+ | |||
+ | https:// | ||
https:// | https:// | ||
+ | |||
+ |
chess/programming/msb_most_significant_bit.1635595958.txt.gz · Last modified: 2021/10/30 12:12 by peter