今天在某公司面试,出现这样一道面试,大概意思如下:
假设某系统同时最多支持128个设备,要求从编号1开始分配设备编号,例如,当设备编号 1, 2, 3, 5, 6,已经分配,那么下次插入一个设备的时候要求分配编号4,试题给定定一下参数,
#define uint32 unsigned int
#define uint8 unsigned char
uint32 bitmap[4];
思路:当时考虑用位图和一个位图表来查找,只需要求构造一个位图表就可以直接查询,例如ucos里的128个任务优先级就是构造任务优先级表,然后直接查表就可以,当时由于时间限制,没有构造完表,现在想起来挺简单的,后来面试的时候只说了一下思路,但是面试官给的是用两个for循环查找,我第一时间就否定了,这样浪费时间,如果大量分配的时候,很浪费时间,一下是我个人写的,我写的是256个,代码如下,表还可以优化,欢迎大家给一个更好的优化方法。
#include <stdio.h>
#include <string.h>
#define uint32 unsigned int
#define uint8 unsigned char
uint8 bit[255] = {
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, //0000 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6, //0001 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, //0010 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7, //0011 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 , //0100 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6 , //0101 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 , //0110 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 8 , //0111 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 , //1000 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6 , //1001 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 , //1010 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7 , //1011 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 , //1100 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6 , //1101 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 , //1110 1111
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //1111 1110
};
void main()
{
uint32 bitmap[4] = {0};
bitmap[0] = 0x0000F3FF;//假设前32个设备都分配完
uint8 i = 0;
uint32 tNum = 0;
uint8 j = 0;
while(i<4){
if(bitmap[i] != 0xFFFFFFFF){
tNum = bitmap[i];
while(j<3){
if((tNum & 0xFF) != 0xFF){ //获取低8字节
printf("return num %d device for user\n", bit[tNum&0xFF] + i*32 + j*8);
return ;
}
j++;
tNum = tNum >> 8;
}
}
i++;
}
printf("unable to return devices\n");
}