编程之美2.1——二进制中1的个数

1.二进制中1的个数

 

 int NumberOf_1(int n)
  {
   int count = 0;
   while(n)
   {
    count++;
    n = n & (n - 1);
   }
   return count;
  }


 

 2.一个数是否是2的N次方


 

 int Is_2N(int n)
  {
   int tmp = n & (n-1);
   if(tmp == 0)
    return 1;
   else
    return 0;
  }


 

 
3.两个数m和n,改变m中二进制表示中的多少位才能得到n



//(1)求这两个数的异或(两个数不同的位置都为1,这些位置都需要改变)
//
//(2)统计异或结果中1的个数
 

 int StepChangeTo(int m, int n)
  {
   int tmp = m ^ n;
   return NumberOf_1(tmp);
  }


4.不用+-*/求两数的和


 

 int Add(int num1, int num2)
  {
   int sum, carry;
   do
   {
    sum = num1 ^ num2;
    carry = (num1 & num2) << 1; //进位,两个数只有在某个位置都为1才有进位
 
   num1 = sum;
    num2 = carry;
   }while(num2 != 0);
   
   return num1;
  }  


 
5.求N!的二进制表示中最低位的1的位置



//从右向左从1 数起
//
//一个数的二进制表示中如果最后是m个0,则这个数有m个质因数2,如36的二进制表示为
//
//100100,它最后有2个0,36=2*2*9,可以看到有2个2,则最低位的1,只比质因数2的个
//
//数多一个,它在第2+1=3位
//
//题目转化为求N!中含有质因数的个数,等于[N/2]+[N/4]+[N/8]+[N/16]+...
//
//[N/2]表示不大于N的数中所有2的倍数贡献一个2
 

 int lowestOne(int N)
  {
   int result = 0;
   while(N)
   {
    N >>= 1;        //(N /= 2)
    result += N;
   }
   return  result;
  }


 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值