std::size_t ceil_log2(T num) { assert(num > 0); if (num & ((T)1 << (BITS_PER_TYPE(T) - 1))) { if ((num & ((T)1 << (BITS_PER_TYPE(T) - 1) - 1)) > 0) { std::cerr << "Internal error: Overflow in floor_log2" << std::endl; std::exit(-1); } return BITS_PER_TYPE(T); } std::size_t log; for (log = BITS_PER_TYPE(T)-1; log--; log >= 0) { if (num & ((T)1 << log)) if ((num & (((T)1 << log) - 1)) > 0) return log+1; else return log; } // Should never be reached assert(1==0); return 42; }
static void i2c_mux_gpio_set(const struct gpiomux *mux, unsigned val) { DECLARE_BITMAP(values, BITS_PER_TYPE(val)); values[0] = val; gpiod_set_array_value_cansleep(mux->data.n_gpios, mux->gpios, NULL, values); }
std::size_t floor_log2(T num) { assert(num > 0); size_t log; for (log = BITS_PER_TYPE(T)-1; log--; log >= 0) { if (num & ((T)1 << log)) return log; } }