计算整数的二进制表示中1的个数
2015-11-05 20:19
260 查看
计算整数的二进制表示中1的个数
算法一:(最容易想到)
最容易想到的算法是用1进行移位与运算 如7的二进制表示为0111 用二进制 标志flag=0001 与7= 0111 运算判断最右边第一位为1 则计数加一,把flag左移一位为0010 与7= 0111进行与运算判断 7=0111 的二进制表示的倒数第二位为1,则计数加一 ,如此类推 当flag左移到为0时 则可计算出 7 = 0111 有3个1.//通过移位来计算 整数的二进制表示中有多少个1 public static int numberOf1(int n){ int count = 0; int flag = 1; while(0 != flag){ if(0 != (n & flag)) count++; flag = flag << 1; } return count; }
算法二:利用 n & (n-1) 会把 n 的最右边的1清零
例如:6 = 0110 ;6 & (6-1)= 0100此算法要比算法一更快,因为对于int型的整数来说 会循环32次;而算法二有多少个1就会循环多少次
对于需要计算整数的二进制有多少个1都可以用算法二计算(把最右边的1变成0;也可用于解决其他类似的问题),不多说 上代码更直观
//通过 n&(n-1) , n&(n-1)会把该整数最右边一个1变成0 计算 整数的二进制表示中有多少个1 public static int numberOf2(int n){ int count = 0; while(0 != n){ count++; n = n & (n-1); } return count; }
相关文章推荐
- 泛型
- 进击的KFC:OC(七)类的扩展
- 初写CSDN博客
- windows 非窗口定时器
- C++ print tuple
- 【树项目3 - 利用二叉树遍历思想解决问题——第10周】
- 2015 10 28  函数
- 修改cmd字体为Consolas
- UML之初识
- mysql select中子查询中使用强制索引的优化案例
- C++delete和delete[]的区别
- 遍历嵌套集合
- Computer Vision: Algorithms and Applications(学习笔记二)--geometric transformations
- 通过onActivityResult()先跳转到联系人界面,然后把传回来的手机号显示到应用的EditText上
- [C++11]二叉树的前序中序后序遍历1(递归)
- 达内学习日志Day45:ActionServlet(实现账务账号的增删查改功能)
- sqoop导入oracle数据至hive
- 浅谈char **p与const char **p赋值问题
- 流水灯51单片机最小系统,顺序、反向点亮,从左到右再从右到左点亮
- hdu5224Subtrees(递归,好题)