算法设计:小技巧汇总

来源:互联网 发布:布局大数据上市公司 编辑:程序博客网 时间:2024/05/19 07:27

1  找出两个数中的最大数:

int biggerFunc(int a, int b){   return ( ( a +b ) + abs( a - b ) ) / 2;}

2 求两个数的平均数:

/** 1、x &  y, 求两个数的二进制下的相同位的和的一半:*                   eg :   1 & 1 = 1;   0 & 0 = 0;  可以看出的确是一半* 2、x ^ y, 求两个数的二进制下的不同位的和: eg:   1 ^ 0 = 1* 3、 >> 1,     除以2* 4、 所以整个表达式的结果就是将(x+y)/2*/int averageFunc(int x, int y){   return (x & y) + ((x ^ y) >> 1);}

3 查看数x的二进制中1的个数

int func(x) { int countx = 0; while(x) {    countx ++;    x = x & ( x - 1 ); } return countx; } 

4 不使用临时变量交换两个值

a ^= b;b ^= a;a ^= b;//或者a ^= b ^= a ^= b;//一般做法如下,使用临时变量。int t = a;a = b;b = t;//可以用于指针和浮点值, 而不象 XOR 技巧只能用于整型

交换函数swap是经常用到的函数,小巧简单,以下两种实现方式都不需要使用临时变量:

以上的swap函数,尤其是第2个实现,简洁美观高效,乃居家旅行必备良品。但是, 使用它们之前一定要想一想,你的程序中,是否有可能会让swap中的两个形参引用同一变量。 如果是,那么上述两个swap函数都将出问题。有人说,谁那么无聊去swap同一个变量。 那可不好说,比如你在操作一个数组中的元素,然后用到了以下语句:

你并没有注意到swap会去操作同一变量,可是当i等于j时,就相当于你这么干了。 然后呢,上面两个实现执行完第一条语句后,操作的那个内存中的数就变成0了。 后面的语句不会起到什么实际作用。

所以如果程序中有可能让swap函数去操作同一变量,就老老实实用最朴素的版本:

voidswap(int&a,int&b){    int tmp=a;    a=b;    b=tmp;}


原文地址:http://www.cricode.com/2442.html


5 写一个函数返回两个数中的较大者,不能使用if-else及任何比较操作符。


If a > b, return a; else, return b.If (a - b) < 0, return b; else, return a.If (a - b) < 0, 令k = 1; else, 令k = 0. return a - k * (a - b).令z = a - b. 令k是z的最高位,return a - k * z.

#include <iostream>using namespace std; int Max1(int a, int b){    int c[2] = {        a, b    };    int z = a - b;    z = (z>>31) & 1;    return c[z];}int Max2(int a, int b){    int z = a - b;    int k = (z>>31) & 1;    return a - k * z;}int main(){    int a = 5, b = 10;    cout<<Max1(a, b)<<endl;    cout<<Max2(a, b)<<endl;    return 0;}

原文地址:http://www.cricode.com/2447.html


6 写一个Add函数求两个数的和,不能使用+号或其它算术运算符。

int Add2(int a, int b){    if(b == 0) return a;    int sum = a ^ b; // 各位相加,不计进位    int carry = (a & b) << 1; // 记下进位    return Add2(sum, carry); // 求sum和carry的和}int Add3(int a, int b){    while(b != 0){        int sum = a ^ b;        int carry = (a & b) << 1;        a = sum;        b = carry;    }    return a;} int Add1(int a, int b){    char *c = (char*)a;    return (int)&c[b]; // c+sizeof(char)*b=a + b}

原文地址:http://www.cricode.com/2513.html



0 0
原创粉丝点击