-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbit_array.h
67 lines (51 loc) · 2.08 KB
/
bit_array.h
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
// bit_array.h
// Řešení IJC-DU1, příklad a), 20.3.2018
// Autor: Jan Havlín, FIT
// Přeloženo: gcc 6.4.0
// Popis: Definice maker a inline funkcí pro práci s bitovými poli
#ifndef BIT_ARRAY_H_
#define BIT_ARRAY_H_
#include <stdio.h>
#include "error.h"
#include <limits.h>
typedef unsigned long bit_array_t[];
#define GET_INDEX(index) 1 + index/(sizeof(unsigned long)*8)
#define GET_SHIFT(index) (index % (sizeof(unsigned long)*8))
#define bit_array_create(jmeno_pole, velikost) unsigned long jmeno_pole[GET_INDEX(velikost) + !!GET_SHIFT(velikost)] = {(unsigned long)velikost, 0}
#define bit_array_size(jmeno_pole) (jmeno_pole[0])
#ifndef USE_INLINE
#define SETBIT_ZERO(jmeno_pole, index) (jmeno_pole[GET_INDEX(index)] &= ~((unsigned long)1 << GET_SHIFT(index)))
#define SETBIT_ONE(jmeno_pole, index) (jmeno_pole[GET_INDEX(index)] |= ((unsigned long)1 << GET_SHIFT(index)))
#define bit_array_setbit(jmeno_pole, index, vyraz) ((vyraz == 0) ? SETBIT_ZERO(jmeno_pole, index) : SETBIT_ONE(jmeno_pole, index))
#define GETBIT_GET(jmeno_pole, index) (!!((jmeno_pole[GET_INDEX(index)]) & ((unsigned long)1 << GET_SHIFT(index))))
#define bit_array_getbit(jmeno_pole, index) (!!((jmeno_pole[GET_INDEX(index)]) & ((unsigned long)1 << GET_SHIFT(index))))
#else
inline void bit_array_setbit(bit_array_t jmeno_pole, unsigned long index, unsigned long vyraz)
{
if (index >= bit_array_size(jmeno_pole))
{
error_exit("Index %lu mimo rozsah 0..%lu\n", (unsigned long)index, (unsigned long)bit_array_size(jmeno_pole)-1);
}
else if(vyraz == 0)
{
jmeno_pole[GET_INDEX(index)] &= ~((unsigned long)1 << GET_SHIFT(index));
}
else
{
jmeno_pole[GET_INDEX(index)] |= ((unsigned long)1 << GET_SHIFT(index));
}
}
inline unsigned long bit_array_getbit(bit_array_t jmeno_pole, unsigned long index)
{
if (index >= bit_array_size(jmeno_pole))
{
error_exit("Index %lu mimo rozsah 0..%lu\n", (unsigned long)index, (unsigned long)bit_array_size(jmeno_pole)-1);
}
else
{
return !!((jmeno_pole[GET_INDEX(index)]) & ((unsigned long)1 << GET_SHIFT(index)));
}
return -1;
}
#endif // USE_INLINE
#endif // BIT_ARRAY_H_