剑指offer第十一题:二进制中1的个数

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

重点掌握原码和补码的转换!!!

解题思路:对于正数使用模2取余法实现;对于负数先让它和2147483647(即:int类型下最大正数)与运算再按照正数的计算方法,最后加上一位符号位即可

代码如下:

 1 public class Solution {
 2     public int NumberOf1(int n) {
 3         if(n==0){
 4             return 0;
 5         }else if(n>0){
 6             int count = 0;
 7             while(n!=0){
 8                 if(n%2==1)
 9                     count++;
10                 n = n / 2;
11             }
12             return count;
13         }else{
14             int count = 0;
15             n = n & 2147483647;
16             while(n!=0){
17                 if(n%2==1)
18                     count++;
19                 n = n / 2;
20             }
21             return count+1;
22         }
23
24     }
25 }

??

原文地址:https://www.cnblogs.com/haq123/p/12106251.html

时间: 2024-10-13 03:07:31

剑指offer第十一题:二进制中1的个数的相关文章

剑指offer系列5:二进制中1的个数

先说下原码,反码和补码的概念.在计算机中用第一位表示数的正负,正数为0,负数为1.所有正数的这三个码相等.对于负数来说,这三个码都不影响其符号位.反码给所有位取反,补码给反码加1. 看完题目我的思路是输入一个数n,先通过循环判断找到一个数k,使得2的k次方>=n,然后判断等于的情况,如果相等,输出1,如果不等于,计算n与2的k-1次方的差记作sig,则得到输出为1+f(sig),代码如下: 1 #include<iostream> 2 #include<vector> 3 #

【Offer】[15] 【二进制中1的个数】

题目描述 思路分析 测试用例 代码链接 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路分析 让整数和1相与,可以判断整数二进制表示中最右边一位是否为1,将1左移之后再和整数相与,可以比较右数第二位,循环比较,就可以统计出二进制中1的个数 (可能一般想到的是将整数右移,之后再和1相与,但是这种方法传入负数时会陷入死循环,因为负数的右移操作会在高位补1,而不是0) 一个整数减去1之后再和原来的整数相与,那么整数二进制中最右边的1会变为0,直到整数变为0,就可以统计出

《剑指Offer》算法题——二维数组查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. class Solution { public: bool Find(vector<vector<int> > array, int target) { int col = array.size(); int i = 0; while (i < col) { int j = array[i].size()

剑指Offer第二十一题 栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) 思路:压栈操作次数固定,用变量记录压栈次数,同时当栈顶元素与弹出序列指针所指位置相同时,执行出栈操作. 代码实现如下: 1 import java.util.*; 2 3 public class

剑指offer第41题 和为s的两个数

#include<iostream> using namespace std; bool sumk(int*list,int length,int*num1,int*num2,int k) { int have=false; if(list==NULL||length<=0||num1==NULL||num2==NULL) return have; *num1=0; *num2=0; int i=0; int j=length-1; while(i<j) { if(list[i]+

剑指offer编程题Java实现——面试题10二进制中1的个数

题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变成0,与运算进行多少次就有多少个1. 1 package Solution; 2 /** 3 * 剑指offer面试题10:二进制中1的个数 4 * 题目:请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数. 5 * 例如,把9表示成二进制是1001,有2位是1,该函数输出2 6 * 解法

《剑指offer》第十五题:二进制中1的个数

// 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #include <cstdio> int NumberOf1_Solution1(int n) { //主要思路:逐位与运算 int count = 0; unsigned int flag = 1; while (flag) { if (n & flag) ++count; flag = fl

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

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

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

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