当时笔试感觉良好,但是遗憾没有接到面试通知,把笔试题目写出来给大家参考参考。试卷分为两部分,第一部分为必做题,第二部分选做两题
思路:题目要求清空二进制数指定位的值,找一个数:需要清除的位置置零,其他位置为1的数。将两个数作与操作。
参考:
#define ClrBit456(x) ((x)&0xFFFFFFC7)
2、What is problem of the following logic and how to modify it to make it work correctly?
void allocate_mem(char *str){
Str = (char*) malloc(100);
}
void test(){
char*str = NULL;
allocate_mem(str);
strcpy(str, "Hello World");
printf(str);
}
思路:指针申请一块内存,然后将字符串拷贝到申请的内存中去,然后输出字符串。定义字符串,然后将指针指向定义的内存块,需要传地址方式或者引用方式,然后将字符串拷贝进指针所指向的内存块中。最后根据指针输出字符串。
参考答案:
void allocate_mem(char **str) {//注意str为二级指针
*str = (char*)malloc(100);//等号右侧为指针类型,左侧也要指针类型
}
void test() {
char *str = NULL;
allocate_mem(&str);//引用方式传递
strcpy(str, "Hello Word");
printf(str);
free(str);//最后不要忘记释放内存
}
3、Please list the system output
unsigned char a;
unsigned short b;
unsigned int c;
unsigned long d;
unsigned long long e;
unsigned int* p1, p2;
cout<< sizeof(a) << " " << sizeof(b) " " << sizeof(c) << " " << sizeof(d) << " "
<< sizeof(e) << " " << sizeof(p1) << " " << sizeof(p2);
Complied and run by 32bit complier
Complied and run by 64bit complier
思路:本题目考察关于32位和64位系统中常见变量的存储长度。为了跨平台的兼容性,常见的变量长度都不变,变化的为:* 指针(4/8)、long(4/8)、unsigned long(4/8)。之所以
p2
不变是因为两个地方都是int
而不是int*
参考:
complier | char | short | int | long | long long | int* p1 p2 |
---|---|---|---|---|---|---|
32 | 1 | 2 | 4 | 4 | 8 | 4 4 |
64 | 1 | 2 | 4 | 8 | 8 | 8 4 |
4、Please list the system output: TODO
unsigned char a = 128;
unsigned int b = ( a << 8 ) & ( a++ ) || (++a);
思路:首先分析unsigned char a=128;二进制为:1000 0000; a<<8左移8位溢出,和a作与操作,结果为0,0再和++a作或,因为a非0,结果为1。b=1;因为a自加了两次,故由128变为130;
a=130
b=1
5、有一只猫在半径为r的圆周上以速度为v移动,猫只能在圆周上移动, 但可以自由改变方向。 圆心位置有一只老鼠。 老鼠可以在圆内自由移动, 但速度仅为 v/4。 老鼠按照什么样的策略/路线可以逃逸圆周而不被捕获。
思路:
1首先计算直接朝外跑,看老鼠跑R这么远,猫在同样时间能否比半个圆周短,如果老鼠跑R的时间,猫跑在同样的时间内跑的超过半个圆周,那么行不通。其实毫无疑问是行不通的,不然题目就没有意义了。
2、我们知道,老鼠虽然速度慢,但是如果老鼠围绕着内圈跑,猫绕着外圈跑,不一定会比猫慢(弧度)。可以找到二者跑同样的弧度的情况下,看此时老鼠离圆心多远,然后看此时再直接朝圆外跑,能不能跑出去,经过计算式可以跑出去的。
void * Alloc64Aligned (int nSize)
void Free64Aligned ( void * p )
思路:
不让自己写内存分配函数;Alloc64Aligned
返回的指针必须是64字节对齐
;不让用全局变量;
参考代码:
void * Alloc64Aligned (int nSize){
char *ret;
int block;
int offset;
int i;
if (size<=0){
return NULL;
}
block=1+size/8;
ret=(char *)malloc(block*8);
offset=((unsigned long)ret)%8;
ret[0]=0;
for (i=1;i<8-offset;++i){
ret[i]=1;
}
return ret+8-offset;
}
void Free64Aligned ( void * p ){
char *buf;
int i;
if (p==NULL){
return ;
}
buf=(char *)p;
for (i=1;i<8;++i){
if (*(buf-i)==0){
break;
}
}
free(buf-i);
}
2、实现一个函数,计算兔子的数量
有一对兔子,从出生后第3个月起每生一对兔子,小兔子长到第三个月后又生一对兔子,假设兔子都不死,问第n个月兔子的总数为多少?
思路:经典的斐波那契数列问题
int CalculateRabbitCount(int Num){
int temp[32],i;
temp[0]=1,temp[1]=1;
for (i=2;i
3、实现以下 random_sort 的函数, 对输入的数组做随机排序
rand函数是已知库函数, 可以返回0到1之间的一个浮点数;array 是输入的一个递增数组, size是数组的长度。 函数返回时的结果也存在array的数组中。
float rand(); // return random value, 0 <= random value < 1
void random_sort(int* array, int size)
参考代码:
void random_sort(int* array, int size){
int i,p,e;
for (i=0;i
4、实现以下程序,对一帧8位灰度图实现双线性拉伸
src_bud
是传入图像, dst_buf
是传出图像, src_width
, srdc_height
是传入图像的宽高, dst_width
, dst_height
是传出图像的宽高
双线性拉伸的定义: 当需要计算P 点的值的时候, P点的值等于分别到最临近的 A, B, C, D四个点的值乘以距离的加权平均。
void bilinear_interpotation(unsigned char* src_buf,
int src_width,
int src_height,
unsigned char* dst_buf,
int dst_width,
int dst_height)
参考代码: