util: New functions for the index of the leftmost or rightmost 1-bit.
authorBen Pfaff <blp@nicira.com>
Thu, 1 Nov 2012 00:13:27 +0000 (17:13 -0700)
committerBen Pfaff <blp@nicira.com>
Sun, 4 Nov 2012 04:13:08 +0000 (21:13 -0700)
These will acquire a user in an upcoming commit.

Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/util.h

index c087b53f4f3cf7a6bca6345e9014904e8b245055..70f36919a5bd0d645225902a10476bf24fe18a4a 100644 (file)
@@ -271,6 +271,27 @@ zero_rightmost_1bit(uintmax_t x)
 {
     return x & (x - 1);
 }
+
+/* Returns the index of the rightmost 1-bit in 'x' (e.g. 01011000 => 3), or 32
+ * if 'x' is 0.
+ *
+ * Unlike the other functions for rightmost 1-bits, this function only works
+ * with 32-bit integers. */
+static inline uint32_t
+rightmost_1bit_idx(uint32_t x)
+{
+    return x ? ctz(x) : 32;
+}
+
+/* Returns the index of the rightmost 1-bit in 'x' (e.g. 01011000 => 6), or 32
+ * if 'x' is 0.
+ *
+ * This function only works with 32-bit integers. */
+static inline uint32_t
+leftmost_1bit_idx(uint32_t x)
+{
+    return x ? log_2_floor(x) : 32;
+}
 \f
 bool is_all_zeros(const uint8_t *, size_t);
 bool is_all_ones(const uint8_t *, size_t);