题目:求整数二进制表示中1的个数。

分析:此题直接考查二进制表示与位运算!!!

   正数和负数的二进制表示不同!在计算机中,正数的二进制表示即为通常所写的二进制;而负数的二进制表示则用补码表示,即原码的反码再+1。

   比如:1) 9:在32位计算机中表示为(十六进制)0x00000009 (其原码=反码=补码=0x00000009);

      2) -9:在32位计算机中表示为(十六进制)0xFFFFFFF7 ,原因:-9的原码=0x00000009,-9的反码=0xFFFFFFF6,-9的补码=0xFFFFFFF7

        所以,-9的二进制表示中1的个数为31 !

  另外,拿8位二进制来说,当表示有符号数时,00000000~01111111表示十进制0~127,而10000000~11111111表示十进制-128~-1 !!!

  位运算比乘除的效率更高!

解决该题时,首先想到的就是避免死循环的那种方法(这里值得骄傲一下!呵呵)

不过,虽然想到了左移1的方法,但由于当时对负数的二进制表示不熟悉,所以认为该方法可能对负数不起作用。。。

但仍先编写了如下代码,目的是验证应用于正数时是否有效:

//未考虑负数情况
int OneNumInBinaryForm(int n)
{int Anded = 1;int i = 1;  //i为二进制中1的位置int maxbits = sizeof(n)*8;//std::cout<<maxbits<<std::endl;int OneNums = 0;while(i <= maxbits){int Anded_iter = Anded<<(i-1);if((Anded_iter&n) != 0)OneNums++;i++;}return OneNums;
}
int main(int argc, char* argv[])
{int n = 9;int nums = OneNumInBinaryForm(n);std::cout<<nums<<std::endl;return 0;
}

不过,在理解了负数的二进制表示后,发现以上代码同样适用于负数,其总体思路和作者的参考代码一致!

但还是那句话,参考代码更加简洁、高效!

//根据作者代码,重写n为正、负数的情况
int NumberOf1(int n)
{int count = 0;unsigned int flag = 1;while(flag){if((flag&n) != 0)count++;flag = flag<<1;}return count;
}int main(int argc, char* argv[])
{int n = 9;int nums = NumberOf1(n);std::cout<<nums<<std::endl;return 0;
}

参考代码中用flag作为循环终止条件,比自己所写的用数字所占位数(sizeof),要好很多。。。,关键在于自己没有想到1在循环左移后,最终会变为0!!!

经验证,-9的二进制表示中1的个数的确为 31!

作者所提供的更NB的方法太巧妙,自己很难想到啊!

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

思想:只要n非零,则n的二进制表示中必有1,且认为该1位于二进制表示的最右边。(while(n),count++);

在计数之后,消除该位置上的1(1->0),采取方法为n&(n-1)(这是较难想到的关键!);

    n=n&(n-1),再循环。

对负数,同样适用!

转载于:https://www.cnblogs.com/hello-yz/p/3249764.html

剑指offer--面试题10相关推荐

  1. 剑指offer——面试题10:二进制中1的个数

    剑指offer--面试题10:二进制中1的个数 关于负数的自己没想出来,这是书中的两种算法,关于位运算的知识还是得要学习一个啊... Solution1: class Solution {public ...

  2. 剑指offer | 面试题10:斐波那切数列

    转载本文章请标明作者和出处 本文出自<Darwin的程序空间> 本文题目和部分解题思路来源自<剑指offer>第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 求斐 ...

  3. 剑指offer——面试题10:斐波那契数列

    个人答案: 1 #include"iostream" 2 #include"stdio.h" 3 #include"string.h" 4 ...

  4. [剑指offer]面试题10:二进制中1的个数

    面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. ❖ 可能引起死循环的解法 ...

  5. 剑指offer面试题[10]-二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: 这是一道很基本的考察二进制和位运算的面试题.思路:先判断证书二进制表示中最右边的一位是不是1.接着再把输入的数字右移 ...

  6. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  7. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  8. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

    [剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 [问题描述][简单] 输入一 ...

  9. (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数

    剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...

  10. 【有返回值的回溯】剑指offer——面试题67——机器人的运动范围(回溯法)

    剑指offer--面试题67:机器人的运动范围(回溯法) Solution1: 此题和66题均是典型的回溯法题目,对比记忆思路! class Solution {public:int movingCo ...

最新文章

  1. Absolute Uninstaller是类似于标准的Windows添加/删除卸载工具
  2. 内网IP段分类 判断ip是否是内网ip
  3. [新活动] 2015年推广返利活动
  4. Jmeter之HTTP Request Defaults
  5. Android之ListView异步加载图片且仅显示可见子项中的图片
  6. Python 代码混淆和加密技术
  7. linux命令行如何换行,一行命令太长,看的不清晰,
  8. WebKit Frame对象分析
  9. 2022年4月8日体检
  10. GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机
  11. HDL4SE:软件工程师学习Verilog语言(四)
  12. java编译出现乱码_java编译乱码解决方法
  13. 一套「MySQL性能优化金字塔法则」
  14. 机器学习的环境搭建流程
  15. 等保2.0三级安全要求
  16. 华为服务器如何正确加装扩展内存
  17. MYSQL选修课的心得体会_选修课心得体会
  18. python输出n的32次方_在Python中,如何将2的32次方-1的值存放到g中?
  19. 第二章补充____微分中值定理及导数应用
  20. Lecture3 损失函数和优化损失函数

热门文章

  1. 设置时间同步(ntp)详细步骤
  2. Retrofit的讲解和使用
  3. 复制虚拟机/vmware中linux系统
  4. 一篇文章了解JsBridge之IOS篇
  5. mui 中template 的使用
  6. 《PaaS程序设计》一1.2 云能为创新做什么
  7. [转载]SVN使用教程
  8. C++day08 学习笔记
  9. html基础知识补全
  10. 软考(6)--数据库