// b: uint32_t array of size n => 32*n bits
// The bit index, i, is in the range 0 <= i < 32 * n
// The bit in b at bit index 0 is always 0!
unsigned idx_of_first_zero_bit_before_or_at (uint32_t *b, unsigned n, unsigned i) {
// Returns a bit index, k, such that k <= i and k is the largest bit index
// for which bit k in b is 0.
}
// As above, value == 0 or 1
void set_bit (uint32_t *b, unsigned n, unsigned i, unsigned value) {
// Sets bit at bit index i to value.
// It could be something like (untested):
if (value)
b[i >> 5] |= (1 << (i&31));
else
b[i >> 5] &= (~(1 << (i&31)));
}
我正在尋找最有效的,但仍然可移植的(在不同的目標,但僅使用了克++編譯器)的方式來實現這些功能(尤其是第一一)。位(大,小端或其他)的存儲順序無關緊要。兩個操作/ C++
天真實現(未經測試):
uint32_t get_bit (uint32_t *b, unsigned n, unsigned i) {
return b[i >> 5] & (1 << (i&31));
}
unsigned idx_of_first_zero_bit_before_or_at (uint32_t *b, unsigned n, unsigned i) {
while (get_bit (b, n, i))
i--;
return i;
}
跳過所有-1元素:
unsigned idx_of_first_zero_bit_before_or_at (uint32_t *b, unsigned n, unsigned i) {
for (unsigned k = i >> 5; ~(b[k]) == 0; i = (--k << 5) + 31);
while (get_bit (b, n, i))
i--;
return i;
}
您未經測試的'get_bit'似乎檢查除了有問題的位以外的所有內容(在相關的32位值中)。只是捨棄反轉。 :-)爲了優化,考慮跳過全是1的32位值,通過反轉和檢查0來輕鬆檢查。Cheers&hth。, – 2010-11-06 16:47:39
@Alf:謝謝,試圖添加您的解決方案 - 可能不盡可能好... – Thomas 2010-11-06 16:57:03
GCC有一些擴展,例如__builtin_clz,所以如果你只需要使用GCC,你可以使用這些擴展。 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html – 2010-11-06 17:11:40