最近刷题也是看到一系列比较好玩的题目,简单列为以下几类
1、写一个函数求一个数补码二进制位中 1 的个数
2、比较两个二进制数当中 不同位 的个数
3、分别打印二进制的 奇数位 和 偶数位
关于第一类:
数字千千万,零从中间砍一半,这是我刚开始的思路,于是我就想到unsigned int 这种写法
把数字变成无符号数就处理掉了一般的情况,效率也不算太低,相比于按位与的暴力比较然后计数的方法已经是很好了。
随后,我也想了很久,这定义无符号数也不是长久之计,我就开始瞎搞,在暴力算法的按位与的基础上,因为某次奇怪的尝试,就催生了我自认为很不错的写法。
这样一步一步消掉1之后,只需要统计步数就可以实现要求,效率也更高。
第二类:
这种统计不同位数的,只需要异或算法后得到一个新的二进制数,再套用第一类问题中的函数就可以完美的解决问题,这里就没有截图,手敲:
void get_diff ( int m , int n )
{ int tmp = m^n ; count_bit_one ( tmp ) ; }
第三类:
看上去,这一种跟前两种的联系就不是太紧密,但是我还是想分享给大家我的思路和做法
首先是移位操作符>> ,然后就是 排除第一位 ,也就是符号位的影响 ,就需要从第 31 位开始打印, 最后打印的时候 每一位都 按位与 1 保证结果准确
如有错误,欢迎各位大佬斧正!