DevC++ 二进制位的爱恨情仇

最近刷题也是看到一系列比较好玩的题目,简单列为以下几类

1、写一个函数求一个数补码二进制位中 1 的个数

2、比较两个二进制数当中 不同位 的个数

3、分别打印二进制的 奇数位 和 偶数位

关于第一类:

数字千千万,零从中间砍一半,这是我刚开始的思路,于是我就想到unsigned int 这种写法

把数字变成无符号数就处理掉了一般的情况,效率也不算太低,相比于按位与的暴力比较然后计数的方法已经是很好了。

随后,我也想了很久,这定义无符号数也不是长久之计,我就开始瞎搞,在暴力算法的按位与的基础上,因为某次奇怪的尝试,就催生了我自认为很不错的写法。

这样一步一步消掉1之后,只需要统计步数就可以实现要求,效率也更高。

第二类:

        这种统计不同位数的,只需要异或算法后得到一个新的二进制数,再套用第一类问题中的函数就可以完美的解决问题,这里就没有截图,手敲:

         void get_diff ( int m , int n )

         { int tmp = m^n ;   count_bit_one ( tmp ) ; }

第三类:

        看上去,这一种跟前两种的联系就不是太紧密,但是我还是想分享给大家我的思路和做法

首先是移位操作符>> ,然后就是 排除第一位 ,也就是符号位的影响 ,就需要从第 31 位开始打印, 最后打印的时候 每一位都 按位与 1 保证结果准确

如有错误,欢迎各位大佬斧正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值