C++奇技淫巧(一):取位数,交换,比较,求均值

  • Post author:
  • Post category:其他


一、计算一个数转化成二进制后包含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;
}


牛逼!!!


————————————————





版权声明:本文为leonharddt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。