summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2023-11-13 15:13:27 -0500
committerTavian Barnes <tavianator@tavianator.com>2023-11-13 15:13:27 -0500
commitcc7d66416b91e0972c1022d0a835804a63ab7ab1 (patch)
tree3e5d75ee69c13173b9d0cff315cdc3fbc6de8772
parent32daab769e4c0902255d9e55843eb94c66d7cb33 (diff)
downloadbfs-cc7d66416b91e0972c1022d0a835804a63ab7ab1.tar.xz
bit: Implement a branchless has_single_bit()
-rw-r--r--src/bit.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/bit.h b/src/bit.h
index 21a8076..7f71d04 100644
--- a/src/bit.h
+++ b/src/bit.h
@@ -350,7 +350,8 @@ UINT_OVERLOADS(FIRST_TRAILING_ONE)
#define HAS_SINGLE_BIT(type, suffix, width) \
static inline bool has_single_bit##suffix(type n) { \
- return n && !(n & (n - 1)); \
+ /** Branchless n && !(n & (n - 1)) */ \
+ return n - 1 < (n ^ (n - 1)); \
}
UINT_OVERLOADS(ROTATE_LEFT)