二进制中1的个数
前言
最近会手写一些常考的面试题目,测试通过后会跟大家分享一下
移位法
仅适应于正数的做法:
移位法就是每次判断n的二进制的最低位是否为1,时间复杂度为O(logn)
代码如下:
int nativeOnenum(int n)
{
int count = 0;
while (n) {
if (n & 1) count ++;
n >>= 1;
}
return count;
}
对于正数没问题,但是如果n为负数,这里就出现问题了,以负数-8为例,二进制补码形式为11111111|11111111|11111111|11111000|,右移一位之后,变成了11111111|11111111|11111111|11111100|,因为是负数,所以符号位会一直补1,导致最后全1,出现死循环
针对这种情况,我们可以用变量flag =1,从右向左去和n比较,32位int最多比较32次即可知道n中1的数量
代码如下:
int oneNum(int n)
{
int count, flag;
for (count = 0, flag = 1; flag; flag <<= 1) {
if (flag & n) count ++;
}
return count;
}
快速法
这种解法的思路是,二进制中1的个数只与1的位数有关,n & (n - 1)快速的去掉最左边的1,例如7(0111) & 6(0110)= 6(0110),快速的去掉了最左边的1
代码如下:
int quickOne(int n)
{
int count = 0;
while (n) {
count ++;
n = n & (n - 1);
}
return count;
}
相关推荐
-
二进制中1的个数
前言 最近会手写一些常考的面试题目,测试通过后会跟大家分享一下 移位法仅适应于正数的做法: 移位法就是每次判断n的二进制的最低位是否为1,时间复杂度为O(logn) 复制代码 代码如下: int nativeOnenum(int n) { int count = 0; while (n) { if (n & 1) count ++; n >>= 1; } return count; } 对于正数没问题,但是如果n
-
php实现统计二进制中1的个数算法示例
本文实例讲述了php实现统计二进制中1的个数算法.分享给大家供大家参考,具体如下: 问题 输入一个十进制整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解决思路 这是个位运算的题目. 解法一:可以通过按位与操作,通过将每一位和1与操作来求出1的个数. 解法二(最优解):一个巧妙的方法,一个不为0的二进制数,肯定至少有一位是1,当这个数减一的时候,它的最后一位1会变为0,后边的所有0会变为1.比如10100,减一之后会变为10011,然后用原数字10100和10011进行与操作之后,会得
-
JavaScript 特有方法计算二进制中1的个数 split方法
代码如下: 复制代码 代码如下: function g(n){ var n = n.toString(2); var count = 0; for(var i=0;i<n.length;i++) { if(n[i] == "1") count++; } return count; } 觉得这样写很麻烦,突然想到是不是可以利用js的split方法来实现计算1的个数,split的参数为正则\0*\,分离字符串中的1.代码如下: 复制代码 代码如下: function f(n){ re
-
C语言判断一个数是否是2的幂次方或4的幂次方
快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方! 将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n个0就可以了. 如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1:因此将原来的数与去减去1后的数字进行与运算后会发现为零. 最快速的方法: (number & number - 1) == 0 原因:因为2的N次方换算是二进制为10--0这样的形式(0除外).与上自己-1的
-
如何判断一个数是否为2的幂次方?若是,并判断出来是多少次方?
将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n个0就可以了.如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1:因此将原来的数与去减去1后的数字进行与运算后会发现为零.最快速的方法:(number & number - 1) == 0原因:因为2的N次方换算是二进制为10--0这样的形式(0除外).与上自己-1的位数,这们得到结果为0.例如.8的二进制为1000:8-1=7,7的二
-
C++求1到n中1出现的次数以及数的二进制表示中1的个数
在从 1 到 n 的正数中 1 出现的次数 题目: 输入一个整数 n,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数. 例如输入 12,从 1 到 12 这些整数中包含 1 的数字有 1, 10, 1 1 和 12, 1 一共出现了 5 次 代码实现(GCC编译通过): #include "stdio.h" #include "stdlib.h" int count1(int n); int count2(int n); int main(void
-
Python求解排列中的逆序数个数实例
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序. 一个排列中逆序的总数就称为这个排列的逆序数. 一个排列中所有逆序总数叫做这个排列的逆序数. 也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序. 一个排列中所有逆序总数叫做这个排列的逆序数. Python代码: def inverse_number(s
-
Python操作redis实例小结【String、Hash、List、Set等】
本文实例总结了Python操作redis方法.分享给大家供大家参考,具体如下: 这里介绍详细使用 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redis中设置值,默认不存在则创建,存在则修改 r.set('name', 'zhangsan') '''参数: set(name, value, ex=None, px=None, nx=False, xx=False) ex,过期时间(秒) px,过期时间(毫秒) nx,如果设
-
C语言中的奇技淫巧
前言 学习C语言的过程中,总会遇到很多令人眼前一亮的代码,尤其是你写了几十行的代码,别人只用了简单几行的递归就实现的功能.下面我就总结几个C语言中 比较新手向的代码.让你有一种"woc!还能这么写!"的想法,二进制 递归大神绕路. 第一种:递归类 求最大公因数 常规写法: int gcd(int m, int n) { int r; if (m>n){r=m,m=n,n=r;} r=n%m; while (r!=0){ n=m; m=r; r=n%m; } return m; }
-
C语言操作符超详细讲解上篇
目录 前言 1.操作符的分类 2.算术操作符 3.移位操作符 3.1 左移操作符 3.1.1 正数左移1位 3.1.2 负数左移1位 3.2 右移操作符 3.2.1 正数右移1位 3.2.2 负数右移1位 3.3 移位操作符说明 4.位操作符 4.1 练习 1 4.2 练习 2 总结 前言 操作符主要内容包括:各种操作符的介绍,用表达式求值. 1.操作符的分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用.函数调用和结构成员
随机推荐
- seaJs的模块定义和模块加载浅析
- php从memcache读取数据再批量写入mysql的方法
- spring boot中的properties参数配置详解
- java 实现回调代码实例
- iOS中 LGLAlertView 提示框的实例代码
- 在ASP.NET 2.0中操作数据之七十二:调试存储过程
- PHP函数microtime()用法与说明
- Laravel框架中扩展函数、扩展自定义类的方法
- C# LINQ to XML应用介绍
- 浏览器图片选择预览、旋转、批量上传的JS代码实现
- php readfile下载大文件失败的解决方法
- 微信小程序 实现tabs选项卡效果实例代码
- 开路者,拓路者分析
- 中文Access2000速成教程--1.3 在“设计”视图中设计表
- JS使用for循环遍历Table的所有单元格内容
- Android实现登陆页logo随键盘收放动态伸缩(完美解决键盘弹出遮挡控件的问题)
- Hibernate迫切连接和普通连接的区别实例详解
- Java继承的实现与继承限制分析
- 基于React+Redux的SSR实现方法
- Android Studio 代码导航快捷键