在mysql数据库中,对于字段性别等特殊字段,可能需要八个变量存储,就算你用tinyint(1),也是不划算的。对于这八个变量至少占用8个字节。但是采用位图,一个字节足矣。我们用一个比特位代表true和false值,而8个变量可缩写成01000010,表示该男性处于未婚状态,户口所在地北京,无研究生学历,共占用一个字节。这样可以节省空间,也提高了处理速度,其实用位图可以理解为位映射。
在mysys/目录下的my_bitmap.c文件包含各种操作位图的函数
====》设置和拆除操作:
my_bool bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits,
my_bool thread_safe __attribute__((unused)))
void bitmap_free(MY_BITMAP *map)
{
DBUG_ENTER("bitmap_free");
if (map->bitmap)
{
#ifdef THREAD
if (map->mutex)
pthread_mutex_destroy(map->mutex);
#endif
my_free((char*) map->bitmap, MYF(0));
map->bitmap=0;
}
DBUG_VOID_RETURN;
}
而在拆除中:
if (map->mutex)
pthread_mutex_destroy(map->mutex);
======》设置和清理整个比特位图或一个具体的比特位
bitmap_set_bit(map, test_bit); 调用
函数原型:
uint bitmap_bits_set(const MY_BITMAP *map)
{
uchar *m= (uchar*)map->bitmap;
uchar *end= m + no_bytes_in_map(map);
uint res= 0;
DBUG_ASSERT(map->bitmap);
*map->last_word_ptr&= ~map->last_word_mask; /*Reset last bits to zero*/
while (m < end)
res+= my_count_bits_ushort(*m++);
return res;
}