码农小汪-剑指Offer之9 - 二进制中1的个数 算数右移 逻辑左移
2016-03-31 10:14
411 查看
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路:
刚开始想法是,不断的进行右移进行与1与运算的话,我们的题目就可以解决了这个问题!但是我们的负数的时候,进行右移位算术右移,不断的补1 这样会造成我们的判断错误!
进行我们的左移动的话不用考虑这些问题,我们不移动我们原来的数字,反之移动我们的比较的数字向左移动,这样比较简单的解决了问题
左移这种事情特别的快,通过我们的cpu的基本寄存器解决问题,如果做乘除法,速度慢了一大截。
代码
package JianzhiOffer; /** * * @author JetWang * */ public class Slution9 { /** * @param n * @return */ public int NumberOf1(int n) { /** * 如果是负数的话,我们不断的右移动,会造成我们通过算数移动,不断的增加1,这个1的数量就是 无穷大的,正数的话没有问题的 */ int count = 0; while (n != 0) { if ((n & 1) == 1) { count++; } n = n >> 1; } return count; } public int NumberOf2(int n) { /** * 这次我们通过向右移动我们作为比较的数字 1101 & 1 = 1 1101 & 10 = 0 1101 & 100 =1 * 这样的情况就不会出现刚才那种样子啦 只要比较的结果不是0,我们的位数自然的加一 对于我们的flag * 要移动多少次,对于Int来说的话最多32次 过了就会溢出为0 */ int count = 0; int flag = 1; while (0 != flag) { if ((flag & n) != 0) { count++; } flag = flag << 1; } return count; } public static void main(String[] args) { System.out.println(new Slution9().NumberOf2(7)); } }
相关文章推荐
- 求字符串中数字之和
- 码农小汪-剑指Offer之8 - 两个栈实现队列
- 码农小汪-剑指Offer之7 - 重建二叉树(根据前序遍历中序遍历求二叉树)
- 码农小汪-剑指Offer之6 - 打印链表格
- LeetCode之旅(15)-Odd Even Linked List
- 面试互联网企业Android开发工程师的一些面试题
- algrothm_面试
- java基础面试题:冒泡排序
- java基础面试题:String和StringBuffer的区别
- 求职宝典 第一章 数组
- 互联网公司java面试题
- mysql基础知识理解和sql题讲解分析面试实战(三)之group_concat
- mysql基础知识理解和sql题讲解分析面试实战(四)之函数讲解和字符串的操作
- 笔记1-从毕业生到程序员:使用C#开发商业软件
- 笔记2-从毕业生到程序员:使用C#开发商业软件
- 笔记3-从毕业生到程序员:使用c#开发商业软件
- 笔记4-从毕业生到程序员:使用c#开发商业软件
- STL面试题
- 码农小汪-剑指Offer之5 -替换空格
- 码农小汪-剑指Offer之4- 在二维数组中查找