1.交换两个变量的值,不使用第三个变量,即a=3, b=5, 交换后b=3, a=5。
unsigned char a = 3, b = 5;
a = a + b;
b = a - b;
a = a - b;
或者
a = a ^ b;
b = a ^ b;
a = a ^ b;
如果写成函数:
void swap(int* a, int *b)
{
*a = *a ^ *b;
*b = *b ^ *a;
*a = *a ^ *b;
printf("In %s:a=%d,b=%d\n",__FUNCTION__,*a,*b);
}
2.如何判别一个数是unsigned?
#define issignal(x) ((x>=0 && ~x>=0) ? 1:0) //为1是无符号 为0有符号
备注:可以直接记住。
signed最高位只是用来做标记(sign),标记整数的正负,0表示正,1表示负。
unsigned都是正数,而signed有正数有负数。
3.写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
int checkCPU()
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
4.写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
int Sum(int n)
{
return ((long)1 + n) * n / 2;//return (1l + n) * n / 2;
}
5.实现x是否为2的若干次幂的判断。
!(X)&(X-1)//为0,不是,否则就是
或者:
int i = 512;
printf("%s\n"(i & (i - 1)) ? false : true);
6.将一整数逆序后放入一数组中(要求递归实现)
void convert(int *result, int n)
{
if(n>=10)
convert(result+1, n/10);
*result = n%10;
}
int main(int argc, char* argv[]) {
int n = 123456789, result[20]={};
convert(result, n);
printf("%d:", n);
for(int i=0; i<9; i++)
printf("%d", result[i]);
return 0;
}
7.