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

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

帖子链接:删繁就简--1 bit的查找,看了白版主的0bit查找的感想
http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=501032&fromuid=711975
(出处: 电子工程世界-论坛)

#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);}}



1 0
原创粉丝点击