思路:

把一个整数和他减1后的数做位于运算,得到的结果(以10进制的整数给出)相当于把原整数的二进制表示中最右端的1变为0,很多问题都可以这么解决。

  • 2的幂 乘2 除2 2的幂指数次放都可以转化为该数的二进制表示方法 左移 右移 二进制中1的个数

  • 整数右移 左移 1位和把整数除2在数学上是一样的,但是除法的效率比移位要低得多,因此实际编程中要尽量多的用移位代替除法

  • 如果是负数移位,因为移位前是个负数,因此保证移位后也要是个负数,所以最高位设为1,如果一直做移位运算,则最后会变成0xffffffff从而变成死循环

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Thu Feb 23 15:17:01 2017
  4. @author: zzpp220
  5. """
  6. #========除法操作效率低,应换成相应的移位操作,再者,下面的方法输入如果是负数就引起死循环===============================================
  7. #def int2Binary(number):
  8. #    rest_Set=[]
  9. #    while number!=0:
  10. #        rest=number%2
  11. #        rest_Set.insert(0,rest)
  12. #        number=number>>1##除2和右移1位相同
  13. #    return rest_Set.count(1)
  14. #==============================================================================
  15. '''
  16. 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
  17. '''
  18. class Solution:
  19.    def NumberOf1(self, n):
  20.        count = 0
  21.        if n < 0:
  22.            n = n & 0xffffffff##是先把负数变成整数的表示方法?
  23.         while n:
  24.            count += 1
  25.            #将整数与其减1后的数字做位于,能起到消掉最右边1的效果,循环后,如果整数不为0,那么一共有多少位为1,循环计数就为几
  26.            n = (n-1)&n
  27.        return count
  28. #==============================================================================
  29. # '''
  30. #(-1&0xffffffff)= 4294967295--正数与0xffffffff位与运算最后返回的是10进制的正数形式      
  31. # bin(-1& 0xffffffff)='0b11111111111111111111111111111111'--转化为2进制
  32. #
  33. # type(bin(-1& 0xffffffff))=str
  34. #
  35. # bin(-1& 0xffffffff).count('1')=32
  36. # bin(-32& 0xffffffff).count('1')=27'''
  37. #==============================================================================
  38.    def NumberOf2(self, n):
  39.    ##先得到负数的二进制表示,其实0xffffffff就是-1,所有的负数和-1的二进制做位与,得到其二进制表示
  40.        return bin(n & 0xffffffff).count('1') if n <0 else bin(n).count('1')
  41.    # 判断一个数是不是2得整数次幂
  42.    def powerOf2(self, n):
  43.        if n&(n-1) == 0:##2的幂 乘2 除2 2的幂指数次放都可以转化为该数的二进制表示方法 左移 右移 二进制中1的个数
  44.            return True
  45.        else:
  46.            return False
  47.    # 判断两个数的二进制表示有多少位不一样, 直接比较两个数的二进制异或就可以 如果是整数和负数比较的话要注意
  48.    def andOr(self, m, n):
  49. #====================方法1-变相求整数的二进制表示法中1的个数==========================================================
  50. ##10进制的整数(正数、负数)和0xffffffff都得到其正数的表示方法
  51.        diff = (m&0xffffffff)^(n&0xffffffff)##给出的是10进制的表示,其二进制表示中1的个数就是不同的位数
  52.         count = 0
  53.         while diff:
  54.             count += 1
  55.             diff = diff&(diff-1)##紧接着判断是否满足
  56.         return count
  57. #==============================================================================
  58. #        return bin((m&0xffffffff)^(n&0xffffffff)).count('1')#方法2
  59. S = Solution()
  60. print(S.NumberOf1(-1))
  61. print(S.NumberOf2(-1))
  62. print(S.powerOf2(64))
  63. print(S.powerOf2(63))
  64. print(S.andOr(-1, 1))

附件列表

转载于:https://www.cnblogs.com/zzxx-myblog/p/6435930.html

面试题10-二进制中1的个数相关推荐

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

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

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

    题目:二进制中1的个数 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...

  3. 【剑指offer-Java版】10二进制中1的个数

    二进制中1的个数: 思路一:循环右移给定的数,但是存在负数出现死循环的问题 思路二:声明一个变量flag并初始化为1,然后循环右移flag,循环次数是和给定数的精度也就是位数有关 思路三:用了二进制一 ...

  4. 剑指Offer - 面试题15. 二进制中1的个数(位运算)

    1. 题目 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:0000 ...

  5. 剑指offer面试题15. 二进制中1的个数(位运算)

    题目描述 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 思路 详见链接 代码 cla ...

  6. 面试题15. 二进制中1的个数

    请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:0000000000 ...

  7. 《剑指offer》第十五题(二进制中1的个数)

    // 面试题:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inclu ...

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

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

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

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

最新文章

  1. 用composer安装laravel-bjyblog
  2. c语言指针要点,C语言指针的重点有哪些?
  3. SAP MM初阶之服务采购订单
  4. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )
  5. markdown转html
  6. 二阶差分预测后数据还原公式_携程如何基于ARIMA时序分析做业务量的预测
  7. [leedcode 215] Kth Largest Element in an Array
  8. CCTF部分赛题分析
  9. 疯狂ios讲义之美化iOS应用
  10. PHP Ctype函数(转)
  11. docker网络配置详解
  12. 双线服务器托管有哪些优势?
  13. BR/EDR控制器: 链接管理协议LMP(Link Manager protocol)
  14. opencv手势识别(2_KNN算法识别)
  15. 第六节-列空间与零空间
  16. c语言u8代表,请问头文件里的 u8,u16 vu 等符号是什么意思?
  17. matlab fprintf输出矩阵
  18. 电子计算机的清除,计算器的清除键是什么
  19. 2-10偶数乘2奇数乘3
  20. [附源码]java毕业设计同德佳苑物业管理系统论文

热门文章

  1. Linux自动注销登录的帐户
  2. 引用网易等相册的图片出现防盗链怎么办呢?看这里就迎刃而解!(转贴)
  3. 他们在大学本科实现童年梦想!自研火箭,飞向外太空,创造人类新纪录
  4. 谁在让字节跳动?张一鸣领衔14大将,106位高管架构首次曝光
  5. 腾讯IDG投资的明星无人车公司Zoox,拿下硅谷第一张载客许可
  6. 便宜可靠的激光雷达可能要来了!Luminar关键部件成本降到3美元
  7. python利用Excel读取和存储测试数据完成接口自动化
  8. AIM Tech Round 5C. Rectangles 思维
  9. SpringBoot基础教程1-1-2 配置文件介绍
  10. heart beat 安装与配置