《程序员面试宝典》一些笔记(2)

来源:互联网 发布:数据库开发岗位认识 编辑:程序博客网 时间:2024/04/28 10:12

在书中看到一些技巧的东西,方法都很巧妙,这里记录一下:

1. 判断一个整数是否是2的N次方:

方法:
X&(X-1)
上面的式子中,如果X为2的N次方,例如二进制1000,结果就会为0。这个方法非常巧妙,还可以用来判断一个整数中,二进制表示中1的个数,如下:
1  int count=0;2  int m=9999;3  while(m){4      count++;5      m = m&(m-1);6  }
程序中第5行,每执行一次,会把m中最低位的1清零。所以最终count最终就得到m中1的个数。

2. 不用判断语句求a、b中的最大值:

方法1:
int max = ((a+b) + abs(a-b)) / 2;
这是个数学运算,还是很巧妙的。

方法2:
1  int c = a - b;2  char* strs[2] = {"a大", "b大"};3  c = unsigned(c) >> (sizeof(int)*8 - 1);4  cout << strs[c]  << endl;
这里第利用了负数,最高为符号为为1的特性。如果b大于a,则第一行中得到c为负数,在第3行中,利用无符号数的右移位(高位补零),留下c最高位,即符号位。

3. 不使用中间变量交换a、b的值:

方法1:
1  a = a - b;2  b = a - b;3  a = a - b;
结果是显而易见的,但是找个方法有一个缺陷是第一行a + b得到的结果可能会越界。下面的方法2则不会存在这样的问题。

方法2:
1  a = a ^ b;2  b = a ^ b;3  a = a ^ b;
这里采用异或运算,不会存在数值越界的问题。很巧妙啊!!

原创粉丝点击