-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbitset.c
83 lines (70 loc) · 2.21 KB
/
bitset.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "bitset.h"
static const unsigned char bitmasks[8] = { 1,2,4,8,16,32,64,128};
static const unsigned char nbitmasks[8] = {~1,~2,~4,~8,~16,~32,~64,0X7F};
bit_set_t *bit_set_init(size_t bit_count){
bit_set_t *new_bits = getMem(sizeof(bit_set_t));
new_bits->size = bit_count;
size_t byte_count = bit_count / 8 + (bit_count % 8 !=0?1:0);
int more = sizeof(long) - ( byte_count % sizeof(long));
byte_count+=more;
new_bits->bits = calloc(sizeof(unsigned char), byte_count);
return new_bits;
}
bit_set_t __bit_set_make(size_t bit_count){
bit_set_t new_bits;
new_bits.size = bit_count;
size_t byte_count = bit_count / 8 + (bit_count % 8 !=0?1:0);
int more = sizeof(long) - ( byte_count % sizeof(long));
byte_count+=more;
new_bits.bits = calloc(sizeof(unsigned char), byte_count);
return new_bits;
}
unsigned char bit_set_get_bit(bit_set_t *bs, size_t bitdex){
size_t index = bitdex / 8;
int bit_index = bitdex % 8;
if(index >= bs->size){return 0;}
return (bs->bits[index] & bitmasks[bit_index]) >> (bit_index) ;
}
void bit_set_set_bit( bit_set_t *bs, size_t bitdex, int val){
size_t index = bitdex / 8;
unsigned char bit_index = bitdex % 8;
if(val){
bs->bits[index] = bs->bits[index] | bitmasks[bit_index];
}
else{
bs->bits[index] = bs->bits[index] & nbitmasks[bit_index];
}
}
void bit_set_set_all( bit_set_t *bs, int value){
int i;
size_t llimit = bs->size / (8*sizeof(long)) + 1;
unsigned long *longs = (unsigned long *) bs->bits;
for(i=0;i<llimit;i++){
longs[i] = (value?-1:0);
}
}
void bit_set_flip_bit(bit_set_t *bs, size_t bitdex){
size_t index = bitdex / 8;
unsigned char bit_index = bitdex % 8;
int val = bs->bits[index] & bitmasks[bit_index];
if(!val){
bs->bits[index] = bs->bits[index] | bitmasks[bit_index];
}
else{
bs->bits[index] = bs->bits[index] & nbitmasks[bit_index];
}
}
vector_t *bit_set_2_index_vec(bit_set_t *bs){
int i;
vector_t *out = vector_init(sizeof(int),bs->size);
for(i=0;i<bs->size;i++){
if(bit_set_get_bit(bs,i)){
vector_put(out,&i);
}
}
return out;
}
void bit_set_free(bit_set_t *bs){
free(bs->bits);
free(bs);
}