1.计算一个数转为为二进制形式后1的个数
-
int func(int x)
-
{
-
int cnt=0;
-
while(x)
-
{
-
cnt++;
-
x&=x-1;
-
}
-
return cnt;
-
}
2.判断一个数是否是2
n方,不使用循环
-
(!x&(x-1))?printf("yes"):printf("no");
3.计算两个整数的平均数,不适用"/"运算符
-
int func(intx, inty)
-
{
-
return (x&y+(x^y)>>1);
-
}
4.判断两个整数a,b的大小,不适用if,?:,switch等判断语句
两种思路:
一种借助绝对式的应用即:
另一种是利用计算机系统中正负数的定义,根据符号位的值来确定正负。
-
int arr[2]={a,b};
-
int bitS,max;
-
bitS=(unsigned)(a-b)>>(sizeof(int)*8-1);
-
max=arr[bitS];
5.交换两个整数,不引入任何中间变量。
两种方法:
第一种:
此种方法存在一个缺点就是如果a,b足够大,会导致a+b时会发生溢出。
第二种:
第三种:
6.find the substring.
-
int index(char* mainStr, char* subStr, int pos)
-
{
-
int i = pos; //the started match pos of main string.
-
int j = 0; //the started match pos of sub string.
-
int lenMain = 0;
-
-
lenMain = strlen(mainStr);
-
lenSub = strlen(subStr);
-
-
while(i<=lenMain && j<=lenSub)
-
{
-
if (mainStr[i] == subStr[j])
-
{
-
i++;
-
j++;
-
}
-
else
-
{
-
i = i-j+1; //back to the next pos of last matching.
-
j = 0;
-
}
-
-
if (j>lenSub)
-
{
-
return i-lenSub;
-
}
-
else
-
{
-
return -1;
-
}
-
}
-
}
7.按a对齐
-
#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
阅读(633) | 评论(0) | 转发(0) |