Bitmap位图数据结构总结(可应用于查找RTOS中优先级最高的任务)

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处 https://blog.csdn.net/qq_21231413/article/details/89374206

1、定义一个位图数据结构,支持32位的位图

typedef struct 
{
	uint32_t bitmap;
}tBitmap;

2、位图结构的初始化

void tBitmapInit (tBitmap * bitmap) 
{
	bitmap->bitmap = 0;
}

3、位图结构的某个位的设置以及删除

void tBitmapSet (tBitmap * bitmap, uint32_t pos)
{
	bitmap->bitmap |= 1 << pos;
}
void tBitmapClear (tBitmap * bitmap, uint32_t pos)
{
	bitmap->bitmap &= ~(1 << pos);
}

4、返回位图的大小

uint32_t tBitmapPosCount (void) 
{
	return sizeof(uint32_t);
}

5、从位图第0个位开始查找,找到第一个被设置为1的位是第几位

uint32_t tBitmapGetFirstSet (tBitmap * bitmap) 
{
    	static const uint8_t quickFindTable[] =     
	{
	    /* 00 */ 0xff, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 10 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 20 */ 5,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 30 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 40 */ 6,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 50 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 60 */ 5,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 70 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 80 */ 7,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* 90 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* A0 */ 5,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* B0 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* C0 */ 6,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* D0 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* E0 */ 5,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
	    /* F0 */ 4,    0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
	};

        if (bitmap->bitmap & 0xff)
        {
            return quickFindTable[bitmap->bitmap & 0xff];
        }
        else if (bitmap->bitmap & 0xff00)
        {
            return quickFindTable[(bitmap->bitmap >> 8) & 0xff] + 8;
        }
        else if (bitmap->bitmap & 0xff0000)
        {
            return quickFindTable[(bitmap->bitmap >> 16) & 0xff] + 16;
        }
        else if (bitmap->bitmap & 0xff000000)
        {
            return quickFindTable[(bitmap->bitmap >> 24) & 0xFF] + 24;
        }
        else
        {
            return tBitmapPosCount();
        }
}

猜你喜欢

转载自blog.csdn.net/qq_21231413/article/details/89374206