1 /* Martin Asser Hansen (mail@maasha.dk) Copyright (C) 2008 - All right reserved */
8 static int mask_array[ 8 ] = {
20 void bitarray_new( bitarray **ba_ppt, size_t size )
22 /* Martin A. Hansen, August 2008. */
24 /* Initialize a new bitarray of a given size in bits. */
26 bitarray *ba_pt = *ba_ppt;
32 ba_pt = mem_get( sizeof( bitarray ) );
34 str_size = size / BITS_IN_BYTE;
35 modulus = size % BITS_IN_BYTE;
42 ba_pt->str_size = str_size;
43 ba_pt->str = mem_get_zero( str_size + 1 );
50 void bitarray_fill( bitarray *ba_pt )
52 /* Martin A. Hansen, August 2008. */
54 /* Set all bits in bitarray to 'on'. */
56 memset( ba_pt->str, BYTE_ON, ba_pt->str_size );
58 ba_pt->bits_on = ba_pt->size;
62 void bitarray_zero( bitarray *ba_pt )
64 /* Martin A. Hansen, August 2008. */
66 /* Set all bits in bitarray to 'off'. */
68 bzero( ba_pt->str, ba_pt->str_size );
74 bool bitarray_bit_on( bitarray *ba_pt, size_t pos )
76 /* Martin A. Hansen, August 2008. */
78 /* Test if a specific bit in a bitarray is set to 'on'. */
81 /* ruler: 01234567 89012345 67890123 */
82 /* bitarray: 00100100 10001000 00010001 */
85 /* AND (&): 00000000 */
87 /* if pos > 0 && modulus > 0: */
88 /* ruler: 01234567 89012345 67890123 */
89 /* bitarray: 00100100 10001000 00010001 */
91 /* BIT4 (modulus 3): 00010000 */
92 /* AND (&): 00010000 */
94 assert( pos <= ba_pt->size );
99 modulus = pos % BITS_IN_BYTE;
100 str_pos = pos ? ( pos / BITS_IN_BYTE ) : 0;
102 if ( modulus != 0 ) {
106 if ( ba_pt->str[ str_pos ] & mask_array[ modulus ] ) {
114 void bitarray_bit_set( bitarray *ba_pt, size_t pos )
116 /* Martin A. Hansen, August 2008. */
118 /* Set the bit at a given position in a bitarray to 'on'. */
121 /* ruler: 01234567 89012345 67890123 */
122 /* bitarray: 00100100 10001000 00010001 */
125 /* OR (|): 10100100 */
127 /* if pos > 0 && modulus > 0: */
128 /* ruler: 01234567 89012345 67890123 */
129 /* bitarray: 00100100 10001000 00010001 */
131 /* BIT5 (modulus 4): 00001000 */
132 /* OR (|): 00011001 */
134 assert( pos <= ba_pt->size );
139 modulus = pos % BITS_IN_BYTE;
140 str_pos = pos ? ( pos / BITS_IN_BYTE ) : 0;
142 if ( modulus != 0 ) {
146 ba_pt->str[ str_pos ] |= mask_array[ modulus ];
150 void bitarray_print( bitarray *ba_pt )
152 /* Martin A. Hansen, August 2008. */
154 /* Debug function to print a bitarray. */
159 str = mem_get_zero( ba_pt->size + 1 );
161 for ( i = 0; i < ba_pt->size; i++ )
163 if ( bitarray_bit_on( ba_pt, i ) ) {
171 printf( "ba_pt->str: %s\n", str );
172 printf( "ba_pt->str (raw): %s\n", ba_pt->str );
173 printf( "ba_pt->size: %zu\n", ba_pt->size );
174 printf( "ba_pt->str_size: %zu\n", ba_pt->str_size );
175 printf( "ba_pt->bits_on: %zu\n", ba_pt->bits_on );
176 printf( "ba_pt->modulus: %zu\n", ba_pt->modulus );
182 void bitarray_destroy( bitarray **ba_ppt )
184 /* Martin A. Hansen, August 2008. */
186 /* Deallocate memory for bitarray. */
188 bitarray *ba_pt = *ba_ppt;
190 mem_free( &ba_pt->str );