[an error occurred while processing this directive]
Вот небольшая библиотечка для работы с битовыми масками, файлы bitmask.c и bitmask.h, может поможет.. Извините за нечитабельные комментарии, это линуксовая кодировка.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Linuxoid 19 августа 2002 г. 12:55
В ответ на: Массив из битовых переменных в IAR C? (+) отправлено MikhailSh 17 августа 2002 г. 18:43


/* bitmask.c */

#include "bitmask.h"

bitmask * calloc_bitmask (int bits) {
int cells;
if (bits <= 0) return NULL;
cells = bits / 32 + ((bits % 32) ? 1 : 0);
return (bitmask *) calloc (cells, sizeof (bitmask));
}

void fill_bitmask (bitmask * mask, int bits) {
int end_cell = bits >> 5;
int current_cell = 0;
while (current_cell <= end_cell) {
mask [current_cell ++] = 0xffffffff;
}
}

void clear_bitmask (bitmask * mask, int bits) {
int end_cell = bits >> 5;
int current_cell = 0;
while (current_cell <= end_cell) {
mask [current_cell ++] = 0x00000000;
}
}

int search_onbit (bitmask * mask, int begin_bit, int end_bit) {
int begin_cell = begin_bit >> 5;
int end_cell = end_bit >> 5;
int current_cell = begin_cell;
int current_bit = begin_bit;
bitmask cell;
bitmask cell_mask;
while (current_cell <= end_cell) {
cell = mask [current_cell];
if (cell == 0x00000000) {
current_bit += 32;
++ current_cell;
continue;
}
cell_mask = 1 << (current_bit & 0x1f);
while (current_bit <= end_bit && cell_mask != 0x00000000) {
if (cell & cell_mask) {
return current_bit;
}
cell_mask <<= 1;
++ current_bit;
}
if (current_bit > end_bit) {
return -1;
}
++ current_cell;
}
return -1;
}

int search_offbit (bitmask * mask, int begin_bit, int end_bit) {
int begin_cell = begin_bit >> 5;
int end_cell = end_bit >> 5;
int current_cell = begin_cell;
int current_bit = begin_bit;
bitmask cell;
bitmask cell_mask;
while (current_cell <= end_cell) {
cell = mask [current_cell];
if (cell == 0xffffffff) {
current_bit += 32;
++ current_cell;
continue;
}
cell_mask = 1 << (current_bit & 0x1f);
while (current_bit <= end_bit && cell_mask != 0x00000000) {
if (!(cell & cell_mask)) {
return current_bit;
}
cell_mask <<= 1;
++ current_bit;
}
if (current_bit > end_bit) {
return -1;
}
++ current_cell;
}
return -1;
}

//-------------------------------------------------------
/* bitmask.h */

#ifndef _BITMASK_
#define _BITMASK_ 1

#include
#include

typedef u_int32_t bitmask;

bitmask * calloc_bitmask (int bits);
void fill_bitmask (bitmask * mask, int bits);
void clear_bitmask (bitmask * mask, int bits);

/* РТПЧЕТЛБ ОБ ЗТБОЙГЩ ОЕ ПУХЭЕУФЧМСЕФУС */

#define bitmask_size(bits) \
((((bits) >> 5) + (((bits) & 0x1f) ? 1 : 0)) << 2)

#define get_bit(mask, bit) \
((mask [(bit) >> 5] & (1 << ((bit) & 0x1f))) != 0)

#define set_bit(mask, bit) \
(mask [(bit) >> 5] |= (1 << ((bit) & 0x1f)))

#define clear_bit(mask, bit) \
(mask [(bit) >> 5] &= ~(1 << ((bit) & 0x1f)))

/* ОЙЦЕ РТЙЧЕДЕООЩЕ ЖХОЛГЙЙ ЧПЪЧТБЭБАФ МЙВП ОПНЕТ ОБКДЕООПЗП ВЙФБ МЙВП -1 */

int search_onbit (bitmask * mask, int begin_bit, int end_bit);
int search_offbit (bitmask * mask, int begin_bit, int end_bit);

#endif


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru