n的二进制中1的个数

题目描述

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

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n!= 0){
            count++;
            n = n & (n - 1);
         }
        return count;
    }
}

1.这个题第一个想到的是 让n和1做与操作,判断结果是不是0,因为1的二进制为00000001,如果结果不为0,那么当前n的最后一位是1,这个时候将n右移,重复如上操作。

2.第一种思路有一个很大的问题就是,当n为负数是,右移高位补充1,会陷入死循环,第二种思路是,n不移动,1移动,1每次都左移动一位,那么1会依次变成00000001,00000010,,0000100,00001000.。。。。。。,这样移位之后的1依次和n做与运算,判断结果是不是0,就可以检查n从后往前的二进制位是不是1了。

3.第三种思路和第二种相似,但是更为巧妙。只要n不等于0,就让n和n-1做与运算,并且让下一个循环的n变成上一次的n与n-1的结果。 原理是,n-1操作,会使n的最后一个1变成0,让最后一个1后面的0都变成1,这个时候在于n做与运算,就相当与把n的最后一个1变成0,每次变一个,并且检查n是否等于0了,即可,执行的次数就是1的个数

时间: 2024-08-10 21:27:45

n的二进制中1的个数的相关文章

[剑指Offer]12.二进制中1的个数

题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路 把一个整数减去1,再和原整数做与运算,会把整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多次这样的操作. 代码 /*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 题目: 12.二进制中1的个数 * 结果:AC * 网址:http://www.nowcoder.com/books/coding-int

第2章 数字之魅——求二进制中1的个数

求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二进制操作,我们知道,除以一个2,原来的数字将会减少一个0.如果除的过程中有余,那么就表示当前位置有一个1. 以10 100 010为例: 第一次除以2时,商为1 010 001,余为0. 第二次除以2时,商为101 000,余为1. 因此,可以考虑利用整型数据除法的特点,通过相除和判断余数的值来进行分析.于是有了如下的

二进制中1的个数

题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. 对于每个输入文件,第一行输入一个整数T,代表测试样例的数量.对于每个测试样例输入为一个整数. .n保证是int范围内的一个整数. 输出: 对应每个测试案例, 输出一个整数,代表输入的那个数中1的个数. 样例输入: 3 4 5 -1 样例输出: 1 2 32 /* 二进制中1的个数 by Rowandjj 2014/7/24 */ #include<stdio.h> #include

【剑指offer】二进制中1的个数

题目描述: 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 分析描述: 1.对一个整数的二进制形式,要想知道其中1的个数,首先想到的应该就是遍历整个二进制数,用到的方法当然就是移动了(包含左移或右移).例如,用1来跟给定的整数做与运算.如果结果为1,则证明整数的二进制形式中,最右边的一位是1,如果结果是0,则证明整数的二进制形式中,最右边的一位是0. int NumberOf1(int n) { int co

nyoj 数的二进制中1的个数

很有用O(n)内实现三类数字分离,以前大多是分成两类数据,快排中分成两类,还有就是"ab***vvvc" 在O(n)中变成 abvvc****,变成两类划分问题 #include<iostream> #include<string.h> using namespace std; const int N=1000; char c[N]; int len; void swap(char &a,char &b) { //a=a^b; //b=a^b;

计算二进制中1的个数

问题:计算某个数的二进制中1的个数 思路:x = x & (x-1) 将 x 的二进制最右面的一个 1 变为 0,其余保持不变.反复操作,直到变为 0 为止,计算操作次数,即为 x 的二进制中 1 的个数. 证明:假设 x 的二进制末尾为 10...0 [末尾有 k 个 0,k = 0,1,2,...]. 则 x - 1 的二进制末尾 k+1 位为 01...1 [末尾有 k 个 1,k = 0,1,2,...],其他与 x 相同. 从而 x & (x-1) 的末尾 k+1 位为 00..

二进制中1的个数(2)

规律总结: 把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中最右边的一个1变为0. 题目1: 用一条语句判断一个整数是不是2的整数次方. 解决思路: 如果一个整数是2的整数次方,那么二进制表示中只有一位是1.将这个数减去1之后再与本身,结果为0则表示这个整数位2的整数次方. bool func(int n) { return ((n-1)&n)==0; } 题目2: 输入两个整数m,n.计算需要改变m的二进制表示中的多少位才能得到n. 思路: 先将m异或n,结

求一个整数的二进制中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 假设该整数为i.首先i和1做与运算,判断i的最低位是不是为1.接着把1左移一位得到2,再和i做与运算,就能判断i的次高位是不是1……这样反复左移,每次都能判断i的其中一位是不是1.基于此,我们得到如下代码 int NumberOf1_Solution(int i) { int count = 0; unsigned int flag = 1; while(flag) { if(

剑指offer (10) 二进制中1的个数

题目:输入一个整数,输出该数二进制表示中1的个数. 我们可能很快写下如下代码: 1 int NumOf1InBinary(int n) 2 { 3 int count = 0; 4 while (n != 0) { 5 if (n & 1 ) { 6 ++count; 7 } 8 n >> 1; // bug!!! 9 } 10 return count; 11 } 第8行存在bug. 首先C/C++中数有无符号数和有符号数两种(我一直认为无符号数是个蛋疼的存在,滋生大量的bug) 左

求一个数二进制中1的个数(优化)。判断一个数是不是2的n次方

求一个数二进制中1的个数: 一般方法: #include<stdio.h> #include<stdlib.h> int   count_one_bits(unsigned int value) { int count = 0; for (int i = 0; i < 32; i++) { if (value & 1 == 1)      (%2相当于&1) { count++; } value = value >> 1;      (右移一位相当