1.返回一个数的二进制中1的数量
int fun(int x)
{
int cnt=0;
while(x)
{
cnt++;
x=x&(x-1);
}
return cnt;
}
2.用一个表达式判断一个数是否是2的N次方。
2,4,8,16转换成二进制数就是10,100,1000,10000,如果x-1后与x做与运算,答案如果是0的话就满足条件
!(x&(x-1))
3.求平均值
int f(int x,int y)
{
return ((x&y)+(x^y)>>1)
}
x&y是取相同位与,这个结构就是x和y相同位的一半。x^y是取x和y的不同位,右移相当于除以2,所以这个函数的功能是取x和y的和的平均值
4.求两个数中较大的那个
有两个变量a和b,不用if,?:,switch或是其他的判断语句,找出两个数中较大的那个
(a+b+abs(a-b))/2
5.不能排序求三个数的中间数
inline int max(int a,int b){return a>=b?a:b;}
inline int min(int a,int b){return a<=b?a:b;}
inline int mid(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));
}
6.不使用中间变量交换两个数
a=a^b;
b=a^b;
a=a^b;