刚参加了某个公司的关于嵌入式软件开发的一场笔试。虽然公司规模一般,但是每参加一次笔试,收获还是有的,在接下来一段时间内,笔者将会尽量把每一次参加过的笔试试题做一个分析:
参加的笔试大体上分为几种:
1)编程语言的基础考察
2)ARM嵌入式的基本概念
3)数据结构
4)Linux系统相关知识
1:编程语言的基础考察
这部分主要包括两个部分:1)出现在选择题中,对一些基本概念的考察。
印象比较深的有两个问题:
问题描述一:以下代码结果是多少?
#include <iostream>
using namespace std;
int func(int x)
{
int count=0;
while(x)
{
count++;
x=x&(x-1);
}
return count;
}
int main()
{
cout<<(9867)<<endl;
return 0;
}
分析:本题func函数返回值是形参x转化成二进制后包含1的数量。理解这一点很容易解答出来。
是因为x&(x-1)每执行一次就会消去一个1,这样只要判断x的二进制有多少个1就可以了。
这个问题在《程序员面试宝典》中已经多次出现。其实本题考察的一个重点还是10进制如何转换成其他进制的一个方法。
问题描述二:
#include <stdio.h>
int main()
{
unsigned int a = 6;
int b=-20;
printf("%d",(a+b)>a?(6):(1));
}
分析:这个问题其实是涉及 了类型转换问题,其实试题中还有一个比较简单类型转换问题,就是把double型转换成int型。关于类型转换的问题,我在http://blog.csdn.net/gzbaishabi/article/details/38590025中已经介绍的比较详细。但是恰恰在说到有符号和无符号之间的转换时说的不是很清楚。
先针对上述的这个问题来说,当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式 计算出的结果是6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是非常重要的。
2:ARM嵌入式的相关基本概念
考察这类题,着实把笔者愣住了半天,因为笔者最近一段时间一直在准备Linux相关内容。相反把嵌入式的基本知识给忘了。索性题目还算简单。
问题描述三:简述一下boot loader的作用。
分析:其实简单的来说boot loader 的作用启到一个系统引导的作用和硬件初始化的作用。具体的就在此问题处把boot loader给简单的介绍下。
--------------------------