没有合适的资源?快使用搜索试试~ 我知道了~
gdutxiaoxu#AndroidGuide#【Java】剑指offer(14)二进制中1的个数1
需积分: 0 0 下载量 6 浏览量
2022-07-25
14:33:45
上传
评论
收藏 6KB MD 举报
温馨提示
试读
1.正数(包括边界值1、0x7FFFFFFF) 2.负数(包括边界值0x80000000、0xFFFFFFFF) 1.与二进制有关的题目要往位运算方面想,复习一
资源推荐
资源详情
资源评论
# 【Java】 剑指offer(14) 二进制中1的个数
> 作者:gdutxiaoxu
微信公众号:徐公码字(stormjun94)
来源:https://github.com/gdutxiaoxu/Android_interview 本文参考自《剑指offer》一书,代码采用Java语言。 **更多《剑指Offer》Java实现合集:https://github.com/gdutxiaoxu/Android_interview ****** ## 题目 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。 ## 思路 遇到与二进制有关的题目,应该想到位运算(与、或、异或、左移、右移)。 方法一:”与运算“有一个性质:通过与对应位上为1,其余位为0的数进行与运算,可以某一整数指定位上的值。这道题中,先把整数n与1做与运算,判断最低位是否为1;接着把1左移一位,与n做与运算,可以判断次低位是否为1……反复左移,即可对每一个位置都进行判断,从而可以获得1的个数。这种方法需要循环判断32次。 方法二(better):如果一个整数不为0,把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1。其余所有位将不会受到影响。再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。因此,把一个整数减1,再和原来的整数做与运算,会把该整数最右边的1变成0。这种方法,整数中有几个1,就只需要循环判断几次。 **测试用例** 1.正数(包括边界值1、0x7FFFFFFF) 2.负数(包括边界值0x80000000、0xFFFFFFFF) 3.0 ## **完整Java代码** �
微信公众号:徐公码字(stormjun94)
来源:https://github.com/gdutxiaoxu/Android_interview 本文参考自《剑指offer》一书,代码采用Java语言。 **更多《剑指Offer》Java实现合集:https://github.com/gdutxiaoxu/Android_interview ****** ## 题目 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。 ## 思路 遇到与二进制有关的题目,应该想到位运算(与、或、异或、左移、右移)。 方法一:”与运算“有一个性质:通过与对应位上为1,其余位为0的数进行与运算,可以某一整数指定位上的值。这道题中,先把整数n与1做与运算,判断最低位是否为1;接着把1左移一位,与n做与运算,可以判断次低位是否为1……反复左移,即可对每一个位置都进行判断,从而可以获得1的个数。这种方法需要循环判断32次。 方法二(better):如果一个整数不为0,把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1。其余所有位将不会受到影响。再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。因此,把一个整数减1,再和原来的整数做与运算,会把该整数最右边的1变成0。这种方法,整数中有几个1,就只需要循环判断几次。 **测试用例** 1.正数(包括边界值1、0x7FFFFFFF) 2.负数(包括边界值0x80000000、0xFFFFFFFF) 3.0 ## **完整Java代码** �
点击阅读更多
资源评论
马克love
- 粉丝: 30
- 资源: 320
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功