一、计算一个数转化成二进制后包含1的位数
写法:判断x&(x-1)计算了几次
程序:
int func(int x)
{
int count = 0;
while(x){
count++;
x = x&(x - 1);
}
return count;
}
牛逼!!!
————————————————
二、编程风格
写法1:
if (a == 'A')
写法2:
if ('A' == a)
第二种写法好一些,这时如果少写一个等号就可以检查到错误
————————————————
三、取两个数的平均值
写法:取相同的位与,相当于相同位的和除以2,取不同的位右移,相当于不同位的和除以2
程序:
int f(int x, int y)
{
return (x&y) + ((x^y)>>1);
}
牛逼!!!
————————————————
四、不用判断语句,找到两个数中比较大的
程序:
int f(int x, int y)
{
return ((x + y) + abs(x - y))/2;
}
————————————————
五、找到三个整数的中间数
思路:两两取最大,然后取最小,反之亦可
程序:
int medium(int a, int b, int c)
{
int t1 = max(a, b);
int t2 = max(b, c);
int t3 = max(a, c);
return min(t1, min(t2, t3));
}
————————————————
六、不使用中间变量交换两数的值
思路:加减法容易溢出,异或就不必担心
注意交换函数如何通过形参改变实参!
两种方式:指针,引用
程序1:
void swap1(int *a, int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
程序2(标准写法):
void swap2(int &a, int &b)
{
a = a^b;
b = a^b;
a = a^b;
}
牛逼!!!
————————————————