[an error occurred while processing this directive]
|
/* 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 typedef u_int32_t bitmask; bitmask * calloc_bitmask (int bits); /* РТПЧЕТЛБ ОБ ЗТБОЙГЩ ОЕ ПУХЭЕУФЧМСЕФУС */ #define bitmask_size(bits) \ #define get_bit(mask, bit) \ #define set_bit(mask, bit) \ #define clear_bit(mask, bit) \ /* ОЙЦЕ РТЙЧЕДЕООЩЕ ЖХОЛГЙЙ ЧПЪЧТБЭБАФ МЙВП ОПНЕТ ОБКДЕООПЗП ВЙФБ МЙВП -1 */ int search_onbit (bitmask * mask, int begin_bit, int end_bit); #endif
E-mail:
info@telesys.ru
#include
void fill_bitmask (bitmask * mask, int bits);
void clear_bitmask (bitmask * mask, int bits);
((((bits) >> 5) + (((bits) & 0x1f) ? 1 : 0)) << 2)
((mask [(bit) >> 5] & (1 << ((bit) & 0x1f))) != 0)
(mask [(bit) >> 5] |= (1 << ((bit) & 0x1f)))
(mask [(bit) >> 5] &= ~(1 << ((bit) & 0x1f)))
int search_offbit (bitmask * mask, int begin_bit, int end_bit);
Ответы