经典题目

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;


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值