判断一个整数中有多少个1(二进制)--LeetCode 191
2016-03-03 19:44
211 查看
整数分为有符号整数以及无符号整数。
对于无符号整数,将整数和1相与,然后将整数右移一位,直到整数为0即可。
对于有符号整数,逻辑移位左右移位都是舍弃和补0。算术移位左移舍弃补0,但是右移需要保证符号位不变。因而正整数右移舍弃补0,负整数就要补1,在这种情况下如果采用算术移位,最高位永远都是1,会陷入死循环。
在该题中,算术移位会死循环,逻辑移位才能得到正确结果。
看了一下测试数据,有出现4294967295,确实在unsigned int范围之内,但是java的int表示范围是-2147483648~2147483647,超出了int表示范围,不明白是怎么回事。如果,被表示成了负数,可能就会得到解释了,就是符号位为1的情况,因而会死循环。 不知道是不是这个解释,先留着吧,以后再研究。
另外还有两种挺不错的方法,在别人那里学到的。。
http://blog.csdn.net/xy010902100449/article/details/48445863
对于无符号整数,将整数和1相与,然后将整数右移一位,直到整数为0即可。
对于有符号整数,逻辑移位左右移位都是舍弃和补0。算术移位左移舍弃补0,但是右移需要保证符号位不变。因而正整数右移舍弃补0,负整数就要补1,在这种情况下如果采用算术移位,最高位永远都是1,会陷入死循环。
在该题中,算术移位会死循环,逻辑移位才能得到正确结果。
看了一下测试数据,有出现4294967295,确实在unsigned int范围之内,但是java的int表示范围是-2147483648~2147483647,超出了int表示范围,不明白是怎么回事。如果,被表示成了负数,可能就会得到解释了,就是符号位为1的情况,因而会死循环。 不知道是不是这个解释,先留着吧,以后再研究。
另外还有两种挺不错的方法,在别人那里学到的。。
http://blog.csdn.net/xy010902100449/article/details/48445863
相关文章推荐
- php批量去除bom的代码
- SSH 项目中 用Hibernate底层 简单的封装DAO层
- 360路由器刷openwrt后设置wifi中继
- 电工刀使用注意事项(转载)
- CSS布局模型
- Python xml ElementTree 增加自动缩进(autoindent) 换行
- 28-题目1108:堆栈的使用
- spoj 2319 BIGSEQ - Sequence
- C语言++a与a++的实现机制与操作符结合优先级
- JMS
- 2015年大二上-数据结构-查找-1-(1)-线性表的折半查找
- 安卓图片加载之使用universalimageloader加载圆形圆角图片
- rsync
- inotify
- 错误处理与异常抛出_Swift基础知识学习
- 一维DFT
- CF(441D Valera and Swaps)置换群
- 每周算法讲堂 快速幂
- bzoj4410 [Usaco2016 Feb] Fence in
- 电容补偿技术的作用(转载)