算法设计:小技巧汇总
来源:互联网 发布:布局大数据上市公司 编辑:程序博客网 时间: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
- 算法设计:小技巧汇总
- JS 数据处理技巧及小算法汇总( 一)
- 一些小技巧汇总
- Eclipse小技巧汇总
- 电脑知识 小技巧汇总
- SqlServer小技巧汇总
- 小技巧汇总
- StarUML小技巧汇总
- 小技巧汇总
- ios小技巧汇总
- StarUML小技巧汇总
- 小技巧汇总
- C++小技巧汇总
- CSS小技巧汇总
- 软件应用小技巧汇总
- 小技巧之汇总一
- 小技巧之汇总二
- iphone开发小技巧汇总
- android:ImageView,访问网上图片并显示出来
- 手机吸费赚钱 回拨吸费手机 收入过万
- 如何完成支付宝的支付功能?
- C++primer 第九章:顺序容器----字符串
- 明年的今天会是怎样
- 算法设计:小技巧汇总
- 黑马程序员——javascript面向对象的理解
- 页面自动刷新和跳转
- 给你一组字符如{1,3,4,7,2,1,1,5,2},让你输出里面出现次数最多且数值最大的一个,出现几次
- Java类的构造顺序
- 第三套三
- 总结一下《17天搞定GRE单词》的方法
- 在linux下利用程序崩溃后的core文件分析bug
- Struts2文件上传和下载