bitops: merged bitset functions and cleaned up code
This commit is contained in:
parent
5a8bf83c7b
commit
57f72ea5f5
4 changed files with 61 additions and 71 deletions
|
@ -1,3 +1,10 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
unsigned ilog2(unsigned n);
|
unsigned ilog2(unsigned n);
|
||||||
|
int is_bit_set(void *base, size_t n);
|
||||||
|
void set_bit(void *base, size_t n);
|
||||||
|
void clear_bit(void *base, size_t n);
|
||||||
|
size_t next_set_bit(void *base, size_t n);
|
||||||
|
size_t next_clear_bit(void *base, size_t n);
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
int is_bit_set(void *set, size_t n);
|
|
||||||
void set_bit(void *set, size_t n);
|
|
||||||
void clear_bit(void *set, size_t n);
|
|
||||||
size_t next_set_bit(void *set, size_t len);
|
|
||||||
size_t next_clear_bit(void *set, size_t len);
|
|
|
@ -1,4 +1,10 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <bitops.h>
|
#include <bitops.h>
|
||||||
|
#include <macros.h>
|
||||||
|
|
||||||
|
#define BIT_WORD(n) ((n) / BIT_SIZE(unsigned long))
|
||||||
|
#define BIT_MASK(n) (1UL << ((n) % BIT_SIZE(unsigned long)))
|
||||||
|
|
||||||
unsigned ilog2(unsigned n)
|
unsigned ilog2(unsigned n)
|
||||||
{
|
{
|
||||||
|
@ -9,3 +15,51 @@ unsigned ilog2(unsigned n)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int is_bit_set(void *base, size_t n)
|
||||||
|
{
|
||||||
|
unsigned long *word = (unsigned long *)base + BIT_WORD(n);
|
||||||
|
unsigned long mask = BIT_MASK(n);
|
||||||
|
|
||||||
|
return (*word & mask) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_bit(void *base, size_t n)
|
||||||
|
{
|
||||||
|
unsigned long *word = (unsigned long *)base + BIT_WORD(n);
|
||||||
|
unsigned long mask = BIT_MASK(n);
|
||||||
|
|
||||||
|
*word |= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_bit(void *base, size_t n)
|
||||||
|
{
|
||||||
|
unsigned long *word = (unsigned long *)base + BIT_WORD(n);
|
||||||
|
unsigned long mask = BIT_MASK(n);
|
||||||
|
|
||||||
|
*word &= ~mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t next_set_bit(void *base, size_t n)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < n; ++i) {
|
||||||
|
if (is_bit_set(base, i))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SIZE_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t next_clear_bit(void *base, size_t n)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < n; ++i) {
|
||||||
|
if (!is_bit_set(base, i))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SIZE_MAX;
|
||||||
|
}
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
#include <bitset.h>
|
|
||||||
#include <macros.h>
|
|
||||||
|
|
||||||
int is_bit_set(void *set_, size_t n)
|
|
||||||
{
|
|
||||||
uint8_t *set = set_;
|
|
||||||
uint8_t *word, mask;
|
|
||||||
|
|
||||||
word = set + n / BIT_SIZE(*set);
|
|
||||||
mask = (1 << (n % BIT_SIZE(*set)));
|
|
||||||
|
|
||||||
return (*word & mask) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_bit(void *set_, size_t n)
|
|
||||||
{
|
|
||||||
uint8_t *set = set_;
|
|
||||||
uint8_t *word, mask;
|
|
||||||
|
|
||||||
word = set + n / BIT_SIZE(*set);
|
|
||||||
mask = (1 << (n % BIT_SIZE(*set)));
|
|
||||||
|
|
||||||
*word |= mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear_bit(void *set_, size_t n)
|
|
||||||
{
|
|
||||||
uint8_t *set = set_;
|
|
||||||
uint8_t *word, mask;
|
|
||||||
|
|
||||||
word = set + n / BIT_SIZE(*set);
|
|
||||||
mask = (1 << (n % BIT_SIZE(*set)));
|
|
||||||
|
|
||||||
*word &= ~mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t next_set_bit(void *set_, size_t len)
|
|
||||||
{
|
|
||||||
uint8_t *set = set_;
|
|
||||||
size_t n;
|
|
||||||
|
|
||||||
for (n = 0; n < len; ++n) {
|
|
||||||
if (is_bit_set(set, n))
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SIZE_MAX;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t next_clear_bit(void *set_, size_t len)
|
|
||||||
{
|
|
||||||
uint8_t *set = set_;
|
|
||||||
size_t n;
|
|
||||||
|
|
||||||
for (n = 0; n < len; ++n) {
|
|
||||||
if (!is_bit_set(set, n))
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SIZE_MAX;
|
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue