[原创] 删繁就简--1 bit的查找,看了白版主的0bit查找的感想

tqOS中使用了OsMapTable任务优先级映射表来查找最高有效位。这在8*8任务的系统中是可行的,需要的查找表有256个元素。但是如果进一步提升系统的最大可支持的任务数量,比如16*16最大支持256个任务的话,就需要查找表中有2^16=65535个元素,每个元素2个字节,也就是一共128KB......不可思议,所以如果扩展最大任务数量至16*16甚至是32*32,用查找表就不合适了。可以使用循环判断最高有效位的方法,但是毕竟循环的时间复杂度不稳地,所以有了下面的基于二分查找法的最高有效位查找算法,这是我在EEWORLD里面发的一个帖子,保存下来,以后如果要修改tqOS可能会用上,也有可能在其他场合用上。程序也能修改为最高有效bit0位的查找。原理相似。

帖子链接: 删繁就简--1 bit的查找,看了白版主的0bit查找的感想

#include "stdio.h"

int bit1search(unsigned int data)
{
	int pos = 0;
	if((data | 0x0000ffff) != 0x0000ffff)
	{
		data >>= 16;
		pos += 16;
	}
	if((data | 0x000000ff) != 0x000000ff)
	{
		data >>= 8;
		pos += 8;
	}
	if((data | 0x0000000f) != 0x0000000f)
	{
		data >>= 4;
		pos += 4;
	}
	if((data | 0x00000003) != 0x00000003)
	{
		data >>= 2;
		pos += 2;
	}
	if((data | 0x00000001) != 0x00000001)
	{
		data >>= 1;
		pos += 1;
	}
	return pos;
}

int bit1search_for(unsigned int data)
{
	int pos = 0,i;
	for(i=0;i<32;i++)
	{
		if(data & (1 << i))
			pos = i;
	}
	return pos;
}

void main()
{
	printf("%d %d\r\n",bit1search(0x00000008),bit1search_for(0x00000008));
	printf("%d %d\r\n",bit1search(0x86716545),bit1search_for(0x86716545));
	printf("%d %d\r\n",bit1search(0x69874861),bit1search_for(0x69874861));
	printf("%d %d\r\n",bit1search(0xe987d986),bit1search_for(0xe987d986));
	printf("%d %d\r\n",bit1search(0x04898646),bit1search_for(0x04898646));
	printf("%d %d\r\n",bit1search(0x14584646),bit1search_for(0x14584646));
	printf("%d %d\r\n",bit1search(0x35168468),bit1search_for(0x35168468));
	printf("%d %d\r\n",bit1search(0x81763422),bit1search_for(0x81763422));
	int i,a,b;
	for(i=0;i<0xFFFFFFFF;i++)
	{
		a = bit1search(i);
		b = bit1search_for(i);
		if(a != b)
			printf("error%d\r\n",i);
	}
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值