diff options
Diffstat (limited to 'src/common.h')
| -rw-r--r-- | src/common.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/common.h b/src/common.h index 27082b7..1b4d007 100644 --- a/src/common.h +++ b/src/common.h | |||
| @@ -61,4 +61,19 @@ | |||
| 61 | #define SETBIT(m, x) (m |= BITMASK(x)) | 61 | #define SETBIT(m, x) (m |= BITMASK(x)) |
| 62 | #define CLEARBIT(m, x) (m &= ~BITMASK(x)) | 62 | #define CLEARBIT(m, x) (m &= ~BITMASK(x)) |
| 63 | 63 | ||
| 64 | /* Count number of bits (Sean Eron Andersson's Bit Hacks) */ | ||
| 65 | static inline int bitcount(unsigned v) | ||
| 66 | { | ||
| 67 | v -= ((v>>1) & 0x55555555); | ||
| 68 | v = (v&0x33333333) + ((v>>2) & 0x33333333); | ||
| 69 | return (((v + (v>>4)) & 0xF0F0F0F) * 0x1010101) >> 24; | ||
| 70 | } | ||
| 71 | |||
| 72 | /* Return index of first bit [0-31], -1 on zero */ | ||
| 73 | #define firstbit(v) (__builtin_ffs(v) - 1) | ||
| 74 | |||
| 75 | /* boost-style foreach bit */ | ||
| 76 | #define foreach_bit(i, m) \ | ||
| 77 | for (i = firstbit(m); i >= 0; i = firstbit((m) & (~0U << i + 1))) | ||
| 78 | |||
| 64 | #endif | 79 | #endif |
