22.整数二进制表示中1的个数

http://zhedahht.blog.163.com/blog/static/2541117420073118945734/

另外一种思路是如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减去1,那么原来处在整数最右边的1就会变成0,原来在1后面的所有的0都会变成1。其余的所有位将不受到影响。举个例子:一个二进制数1100,从右边数起的第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成1,而前面的1保持不变,因此得到结果是1011。

我们发现减1的结果是把从最右边一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000。也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

这种思路对应的代码如下:


int func(int x)
{
int countx = 0;
while(x)
{
countx++;
x = x&(x-1);
}
return countx;
}

扩展:如何用一个语句判断一个整数是不是二的整数次幂?

bool Is2n(int x)
{
return x&(x-1)==0;
}

时间: 2024-07-29 07:19:30

22.整数二进制表示中1的个数的相关文章

22、输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: n &(n-1)把n的最右边的1去掉,用count++计算1的个数  eg: 101 & 100 = 100   1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int count = 0; 5             while(n!=0){ 6                 count++; 7                 n = n&

【C语言】输入一个整数,输出该数二进制表示中1的个数(三种方法)

输入一个整数,输出该数二进制表示中1的个数.如输入32,输出1. 代码实现: 方法1:与运算 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; int FindOneNumber(unsigned int num) {     int numberofOne = 0;     while (num)     {         num = num & (num - 1);         

剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)

1. 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 2. 思路和方法 使用移位(<<)和 “| & !”操作来实现.1的二进制是:前面都是0,最后一位为1.每次向左移位一下,使得flag的二进制表示中始终只有一个位为1,每次与n做位与操作,这样就相当于逐个检测n的每一位是否是1.unsigned int flag = 1; 3. C++核心代码 3.1 位运算 1 class Solution { 2 public: 3 int NumberOf1(int

整数的二进制表示中1的个数

给出通常能想到的方式,这两种方式在<C和指针>一书中给出.以下讨论的均为非负整数. /* 该方法每次在循环中判断数的二进制最右一位是否为1(如果该数能不能被2整除). 每次循环后该数右移一位.因此遍历了数的二进制表示的每一位. */ int count_one_bits1(int value) { int count; for (count = 0; value != 0; value >>= 1) if (value % 2 != 0) count++; return count

笔试算法题(14):整数二进制表示中的1 &amp; 判定栈的push和pop序列是否对应

出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位,k%2 ==0表示其是否是偶数,如果不是则说明当前二进制表示的最右边一位为1,当k==0成立的时候移位结束: 另外还可以使用'消1'的方法,如果二进制表示A为'****1000',则A-1为'****0111',也就是我们仅关注二进制表示最右边的第一个 1,这样的话A&(A-1)的结果就可以将最右边的

每天一道算法题:数字二进制形式中1的个数

题目:请实现一个函数,属于一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有2位为1.因此如果输入9,该函数输出2. 可能的死循环陷阱 看完题目,相信大家很快就能想到一个解题思路:先判断整数二进制表示中最右边的一位是否为1,接着把输入的整数右移一位,此时原来处于从右边起的第二位被移动至最右边了,再判断是不是1,这样每次移动一位,直到这个整数变成0,即能够得到整数二进制表示形式中1的个数,而现在问题变为如何判断数字的最后一位为1,其实这个也很简单,只需要将数字与1做与运算,

一个数的二进制表示中1的个数——10

实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,将9表示成二进制为1001,有2位是1,因此如果输入数字9,该函数输出2. 如果让我们将一个十进制的数转换成二进制的表示,我们就会不停的模除模除2取它的余数,因此,就可以用这样的方法解决: #include <iostream> using namespace std; size_t count_one_num(int n) {     size_t count = 0;     while(n != 0)     {      

【剑指offer】七,二进制表示中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 1 public class Solution { 2 public int NumberOf1(int n) { 3 int count = 0 ; 4 while(n!=0){ 5 count++ ; 6 n = n&(n-1) ; 7 } 8 return count ; 9 }

N11-该数二进制表示中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. package new_offer; /** * 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. * @author Sonya * */ public class N11_NumberOf1 { public int NumberOf1(int n) { String bstring=Integer.toBinaryString(n);// System.out.print("转换成的二进制字符串: