Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33903
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 127
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-09 10:27
文章分类

全部博文(12)

文章存档

2014年(7)

2013年(5)

我的朋友

分类: C/C++

2013-11-09 22:49:35

1.计算一个数转为为二进制形式后1的个数

点击(此处)折叠或打开

  1. int func(int x)
  2. {
  3.   int cnt=0;
  4.   while(x)
  5.   {
  6.     cnt++;
  7.     x&=x-1;
  8.   }
  9.   return cnt;
  10. }
2.判断一个数是否是2n方,不使用循环

点击(此处)折叠或打开

  1. (!x&(x-1))?printf("yes"):printf("no");
3.计算两个整数的平均数,不适用"/"运算符

点击(此处)折叠或打开

  1. int func(intx, inty)
  2. {
  3.   return (x&y+(x^y)>>1);
  4. }
4.判断两个整数a,b的大小,不适用if,?:,switch等判断语句
两种思路:
一种借助绝对式的应用即:

点击(此处)折叠或打开

  1. max=(a+b+abs(a-b))/2;
另一种是利用计算机系统中正负数的定义,根据符号位的值来确定正负。

点击(此处)折叠或打开

  1. int arr[2]={a,b};
  2. int bitS,max;
  3. bitS=(unsigned)(a-b)>>(sizeof(int)*8-1);
  4. max=arr[bitS];
5.交换两个整数,不引入任何中间变量。
两种方法:
第一种:

点击(此处)折叠或打开

  1. a=a+b;
  2. b=a-b;
  3. a=a-b;
此种方法存在一个缺点就是如果a,b足够大,会导致a+b时会发生溢出。
第二种:

点击(此处)折叠或打开

  1. a^=b;
  2. b^=a;
  3. a^=b;
第三种:

点击(此处)折叠或打开

  1. b=b-(a=(b=a+b)-a);
6.find the substring.

点击(此处)折叠或打开

  1. int index(char* mainStr, char* subStr, int pos)
  2. {
  3.     int i = pos; //the started match pos of main string.
  4.     int j = 0; //the started match pos of sub string.
  5.     int lenMain = 0;
  6.     
  7.     lenMain = strlen(mainStr);
  8.     lenSub = strlen(subStr);

  9.     while(i<=lenMain && j<=lenSub)
  10.     {
  11.         if (mainStr[i] == subStr[j])
  12.         {
  13.             i++;
  14.             j++;
  15.         }
  16.         else
  17.         {
  18.             i = i-j+1; //back to the next pos of last matching.
  19.             j = 0;
  20.         }

  21.         if (j>lenSub)
  22.         {
  23.             return i-lenSub;
  24.         }
  25.         else
  26.         {
  27.             return -1;
  28.         }
  29.     }
  30. }
7.按a对齐

点击(此处)折叠或打开

  1. #define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))















阅读(633) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:程序员面试宝典(第三版)删除注释代码勘误

给主人留下些什么吧!~~