diff options
| author | Henrik Rydberg <rydberg@euromail.se> | 2010-05-14 01:09:42 +0200 |
|---|---|---|
| committer | Henrik Rydberg <rydberg@euromail.se> | 2010-05-14 01:41:39 +0200 |
| commit | f02210172efc6bfc05c4598c14e1268d2828097e (patch) | |
| tree | 00457552d4fe048b17b4a73d58d17c9db63552f8 /src/common.h | |
| parent | 1e37ed517ef0906767a230ab384b8e66869cf4b2 (diff) | |
Simplify bit bookkeeping
In preparation of adding several additional finger bit registers,
remove the redundant bit-counting variables and introduce fast
bit-traversal functions instead.
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
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 |
