算法设计:小技巧汇总

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值