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