不使用循环,统计给定长度binary中1的个数

 from腾讯2008实习生招聘

从数学角度未发现在不约定位数情况下解决此问题的方法。

 

本方法基于迭代缩位思想,对于n2进制数,首先将每2位数的1个数保存在此2位上(),然后将每4位数的1个数保存在此4位上,以此类推直到将每n/2位数的1个数保存结束,最终所得的2进制数即为原数的1个数。

关键在于,每一轮中分别将2位、4位……等看作一个digit来处理,即多个数位同时参与加法运算。

 

实现方法,设原数据为binary : long(约定8)

binary = ( binary & 01010101 ) /*奇数位1个数*/+ ( binary >> 1 & 01010101 )/*偶数位1个数*/;

binary = ( binary & 00110011 )/*每两位为一位,奇数位1个数*/ + ( binary >> 2 & 00110011 )/*偶数位1个数*/;

binary = ( binary & 00001111 ) /*每四位为一位,奇数位1个数*/ + ( binary >> 4 & 00001111 ) /*偶数位1个数*/;

return binary;

 

测试数据,8位二进制数10110101

第一轮:10110101 & 01010101 == 00010101, 11011010 & 01010101 == 01010000, 00100101 + 01010000 == 01100101; 观察所得值01110101,一二位01代表原数据一二位有11,三四位一样,五六位10==十进制2即原数据五六位共有21,七八位也是01

第二轮:01100101 & 00110011 == 00100001, 01011001 & 00110011 == 00010001, 00100001 + 00010001 == 00110010;

第三轮:00110010 & 00001111 == 00000010, 00100011 & 00001111 == 00000011, 00000010 + 00000011 == 00000101;即十进制的5,对应原数据有51

 

若未约定位数,则无法在不使用循环条件下确定步骤及与运算数据。

转载于:https://www.cnblogs.com/truezhuge/archive/2008/05/11/1192305.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值