embox

Форк
0
/
bitmap_find_bit.c 
45 строк · 870.0 Байт
1
/**
2
 * @file
3
 *
4
 * @date 21.10.2013
5
 * @author Eldar Abusalimov
6
 */
7

8
#include <limits.h>
9
#include <stdbool.h>
10

11
#include <lib/libds/bit.h>
12
#include <lib/libds/bitmap.h>
13

14
unsigned int __bitmap_find_bit(const unsigned long *bitmap, unsigned int nbits,
15
    unsigned int start, bool zero_bit) {
16
	const unsigned long *first;
17
	const unsigned long *last;
18
	const unsigned long *iter;
19
	unsigned long bits;
20

21
	if (start >= nbits) {
22
		return nbits;
23
	}
24

25
	first = bitmap + BITMAP_OFFSET(start);
26
	last = bitmap + BITMAP_OFFSET(nbits - 1);
27

28
	for (iter = first; iter <= last; iter++) {
29
		bits = *iter;
30
		if (zero_bit) {
31
			bits = ~bits;
32
		}
33
		if (iter == first) {
34
			bits &= ~0UL << BITMAP_SHIFT(start);
35
		}
36
		if (iter == last) {
37
			bits &= ~0UL >> (LONG_BIT - 1 - BITMAP_SHIFT(nbits - 1));
38
		}
39
		if (bits) {
40
			return LONG_BIT * (iter - bitmap) + bit_ctz(bits);
41
		}
42
	}
43

44
	return nbits;
45
}
46

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.