[题目] 输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. [分析] 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减去1,那么原来处在整数最右边的1就会变成0,原来在1后面的所有的0都会变成1.其余的所有位将不受到影响.举个例子:一个二进制数1100,从右边数起的第三位是处于最右边的一个1.减去1后,第三位变成0,它后面的两位0变成1,而前面的1保持不变,因此得到结果是1011. 我们发现减1的结果是把从最右边…
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位操作,但还是麻烦.直接按照int的位数,32或64,做这么多次移位操作就好了,每次移位操作累计是否为1.int的位数是32还是64,可以写一个函数来做到,而不是硬编码. class Solution { public: int NumberOf1(int n) { int cnt = 0; int…
#include "limits.h" #include "math.h" int abs(int number) { int const mask = number >> (sizeof(int) * CHAR_BIT - 1); return (number + mask) ^ mask; }   这是一个求绝对值的函数,看了它不禁想起负数在计算机中的构成.   负数在计算机中是按补码存储的,如何给定一个int型数,输出它的补码呢?以及给一个数的补码…
1. 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 2. 思路和方法 使用移位(<<)和 “| & !”操作来实现.1的二进制是:前面都是0,最后一位为1.每次向左移位一下,使得flag的二进制表示中始终只有一个位为1,每次与n做位与操作,这样就相当于逐个检测n的每一位是否是1.unsigned int flag = 1;  例如:5&1 = 101 & 001,1前面补0. 3. C++核心代码 3.1 位运算 class Solutio…
出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位,k%2 ==0表示其是否是偶数,如果不是则说明当前二进制表示的最右边一位为1,当k==0成立的时候移位结束: 另外还可以使用‘消1’的方法,如果二进制表示A为'****1000',则A-1为'****0111',也就是我们仅关注二进制表示最右边的第一个 1,这样的话A&(A-1)的结果就可以将最右边的…
转:http://toutiao.com/a4280977370/ [解法一] 可以举一个八位的二进制例子来进行分析.对于二进制操作,我们知道,除以一个 2,原来的数字将会减少一个0.如果除的过程中有余,那么就表示当前位置有一个1.以 10 100 010 为例:第一次除以 2 时,商为1 010 001,余为0.第二次除以 2 时,商为101 000,余为1.因此,可以考虑利用整型数据除法的特点,通过相除和判断余数的值来进行分析.于是有了如下的代码. 代码清单 2-1 [解法二]使用位操作 前…
问题描述: 输入一个整数n,求n的二进制表示中,一共有多少个1.例如n=8,二进制表示为00001000,二进制表示中有1个1.     分析: 如果一个数n不为0,那么n-1的二进制表示,与n的二进制表示相比,n的二进制表示最右边的1变为0,而最右边的1所对应的0全部变为1.其余位不受影响. 例如:n的二进制表示为****1000,则n-1的二进制表示为****0111,则n&(n-1)的二进制表示为****0000.将n二进制表示中最右边的1去掉了. 将n赋值为n&(n-1),继续循环…
Codewars Write a function that takes an integer as input, and returns the number of bits that are equal to one in the binary representation of that number. You can guarantee that input is non-negative. Example: The binary representation of 1234 is 10…
想知道某一位是否为1,只需和当前位对应的2的幂进行按位与运算即可. 如下示例,可以知道第6位是1,同理可知其他位是否为1,累加就能得到1的个数: 10001001 00000000 int cnt = 0; while (x) { cnt += x&1; x >>= 1; }…
Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime number of set bits in their binary representation. (Recall that the number of set bits an integer has is the number of 1s present when written in bin…
第一种:使用n&(n-1)表示来计算有多少个1 int n=127; int count=0; while (n!=0){ count++; n=n&(n-1); } 第二种:使用移位操作 Integer input = in.nextInt(); int count=0; for(int i=0;i<30;i++){ int tmp = (input >> i)&0x00000001; if(tmp==1){ count++; } } System.out.pr…
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把 9 表示成二进制是 1001,有 2 位是 1.因此如果输入 9,该函数输出是 2. 算法设计思想 计算一个整数的二进制表示中 1 的个数有多种算法.本文主要介绍两种算法,按位与运算算法和快速算法,更多算法,可以查看网友 zdd 的博文 “算法-求二进制数中1的个数”. 按位与运算算法思想很简单,…
算法-求二进制数中1的个数 问题描述 任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4 这也是一道比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,下面介绍了几种方法来实现这道题,相信很多人可能见过下面的算法,但我相信很少有人见到本文中所有的算法.如果您上头上有更好的算法,或者本文没有提到的算法,请不要吝惜您的代码,分享的时候,也是学习和交流的时候. 普通法 我总是习惯叫普通法,因为我实在找不到一个合适的…
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题代码 法一: public class Solution { public int NumberOf1(int n) { int cnt = 0; while(n != 0){ n &= (n - 1); cnt++; } return cnt; } } 法二: public int NumberOf1(int n) { return Integer.bitCount(n); }…
面试题 15. 二进制中 1 的个数 题目描述 题目:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. Java 实现 方法一 public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int count=0; while(n!=0){ count+=(n&1); n=n>>>1; } return count; } }…
// 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #include <cstdio> int NumberOf1_Solution1(int n) { ; unsigned ; while (flag) { if (n & flag) count++; flag = flag << ; } return count; } int Nu…
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 牛客网链接 思路 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话).其余所有位将不会受到影响. 举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1.减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开…
Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime number of set bits in their binary representation. (Recall that the number of set bits an integer has is the number of 1s present when written in bin…
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目代码 /** * 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. * Created by YuKai Fan on 2018/8/28. */ public class countNumberOf1 { /** * 方法一: * *如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1, * 那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面…
给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数. (注意,计算置位代表二进制表示中1的个数.例如 21 的二进制表示 10101 有 3 个计算置位.还有,1 不是质数.) 示例 1: 输入: L = 6, R = 10 输出: 4 解释: 6 -> 110 (2 个计算置位,2 是质数) 7 -> 111 (3 个计算置位,3 是质数) 9 -> 1001 (2 个计算置位,2 是质数) 10-> 1010 (2 个计算置位,2 是质数…
762. 二进制表示中质数个计算置位 给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数. (注意,计算置位代表二进制表示中1的个数.例如 21 的二进制表示 10101 有 3 个计算置位.还有,1 不是质数.) 示例 1: 输入: L = 6, R = 10 输出: 4 解释: 6 -> 110 (2 个计算置位,2 是质数) 7 -> 111 (3 个计算置位,3 是质数) 9 -> 1001 (2 个计算置位,2 是质数) 10->…
计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48 分类: C/C++ [转]计算一个无符整数中1Bit的个数(1)   Count the number of bits that are on in an unsigned integer(计算一个无符整数中1Bit的个数)-- (1) 计算一个无符号整数中有多少的Bit为1 这是一个经常遇到的经典问题,这里分两个部分讲解和总结,首先对讲解现有的算法,然后再讲解一些改进算法. 1.循环法(Iterated Count…
整数n的二进制数中1的个数 编写一个函数,输入是一个整数,返回其二进制表达式中数字位数为 '1' 的个数 代码如下: int func(int n)//char ch { int count = 0; while(n > 0) { count++; n&=(n-1); } return count; } 原理:n&(n-1) 按位与 每计算一次,低位减一 如上图中二进制8与自身减一进行按位与操作 如上图二进制3与自身减一进行按位与操作 -由此可的: 8的二进制中有一位1,因此进行了一…
之前也写过一篇这样的文章,但是隔了这么久,竟然忘了.还是要有清晰的思路,才能真正的掌握. 这道题是这样的: 给出两个非负32位整型范围内的数a,b,请输出闭区间[a,b]内所有数二进制中各个位的1的总个数. 分析:为的是求2进制中1的个数.从0-15的二进制如下: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 第一位的1,每隔2就出现.第二位的1,每隔4出现2次.第三位的1,每隔8出…
Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1,1,0,1,1,1] Output: 3 Explanation: The first two digits or the last three digits are consecutive 1s. The maximum number of consecutive 1s is 3. Note: T…
[问题]求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数). [思路]只写一个思路简单而暴力,我们首先使用一个函数去统计每一个数中1的个数,然后,我们遍历1到n的每个数,然后将所有1的统计数量相加,即可得到结果!其他思路都太绕了,也有人将…
为了依次求个位,十位,百位中1的个数,我们可以把这个数字分为三部分,高位数字,当前位数字,低位数字. 如果当前位为0,那么此位为1的数目与高位数字有关 如果当前位为1,那么此位为1的数目与高位和地位都有关 如果当前位其他,那么此位为1的数目与高位数字有关 具体规律看源代码 #include <iostream> using namespace std; int main() { int N; cin >> N; int factor = 1; int count = 0; whil…
一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数? [问题点数:10分,结帖人weicai_chen] 收藏 weicai_chen weicai_chen 等级: 结帖率:95.12% 楼主 发表于: 2007-06-26 22:51:44   如何以最快的速度计算出一个二进制数中1的个数?假设这个二进制数位数可以很长,比如有100位以上或更多... 大家说说自己的想法. 更多 0 分享到: 相关主题推荐: 二进制 面试题 算法 对我有用[0] 丢个板砖[0] 引用 | 举报 |…
要求的是N!的二进制表示中最低位1的位置.给定一个整数N,求N!二进制表示的最低位1在第几位?例如:给定N = 3,N!= 6,那么N!的二进制表示(1 010)的最低位1在第二位. 为了得到更好的解法,首先要对题目进行一下转化. 首先来看一下一个二进制数除以2的计算过程和结果是怎样的. 把一个二进制数除以2,实际过程如下: 判断最后一个二进制位是否为0,若为0,则将此二进制数右移一位,即为商值(为什么):反之,若为1,则说明这个二进制数是奇数,无法被2整除(这又是为什么). 所以,这个问题实际…
php实现 查找输入整数二进制中1的个数 一.总结 一句话总结: 1.if($j&intval($num)){}的作用是什么? 1 <?php 2 while($num=trim(fgets(STDIN))){ 3 $n=0; 4 for($i=0;$i<32;$i++){ 5 $j=1<<$i; 6 //echo $j.PHP_EOL; 7 if($j&intval($num)){ 8 $n++; 9 } 10 } 11 echo $n.PHP_EOL; 12 }…