예제 #1
0
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;
}
예제 #2
0
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);
}
예제 #3
0
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;
	}
}