题目描述

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

题目地址

https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8?tpId=13&tqId=11164&tPage=1&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

思路

思路1:

从右往左逐位判断

思路2:

为了避免死循环,我们可以不右移输入的数据n。首先把n和1做与运算,判断n的最低位是不是为1,接着把1左移一位得到2,再和n做与运算,就能判断n的次低位是不是1.。。这样反复左移,每次都能判断n的其中一位是不是1.注意flag要设定范围。循环次数等于二进制的位数。

思路3:(最优)

如果一个整数不为0,那么这个整数至少有一位是1,如果我们把整数减1,那么原来处在整数最右边的1就会变为0, 原来在1后面的所有0都会变为1(如果最右边的1后面还有0的话)。其余所有位将不受影响。

举个例子:一个二进制数1100,从右边起第三位是处于最右边的1,减去1后,第三位变为0,他后面的两个0变为1了,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果就是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0.如1100&1011 = 1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变成0,那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

在python中,由于负数使用补码表示的,对于负数,最高位为1,而负数在计算机中是以补码存在的,往右移,符号位不变,符号位往右移,最终可能会出现全1的情况,导致死循环。与oxffffffff想与,就可以消去负数的影响。

Python

# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
# 思路1
# if n < 0:
# n = n & 0xffffffff
# count = 0
# while n:
# if n%2 == 1:
# count += 1
# n = n >> 1
# return count
# 思路2
# flag = 1
# count = 0
# while flag and flag <= 0xffffffff:
# if n & flag:
# count += 1
# flag = flag << 1
# return count
# 思路3
if n < 0:
n = n & 0xffffffff
count = 0
while n:
count += 1
n = (n-1)&n
return count
if __name__ == '__main__':
result = Solution().NumberOf1(42)
print(result)

剑指Offer 11. 二进制中1的个数 (其他)的更多相关文章

  1. 剑指offer 11二进制中1的个数

    输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. java版本: public class Solution { public int NumberOf1(int n) { Strin ...

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

    [思路]如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话).其余所有位将不会 ...

  3. 《剑指offer》 二进制中1的个数

    本题来自<剑指offer> 二进制中1的个数 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 两种思路: 第一种:对n进行左移,检测最后一位是否为1,但考 ...

  4. 剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数 Offer 15 题目描述: 方法一:使用1逐位相与的方式来判断每位是否为1 /** * 方法一:使用1逐位与的方法 */ public class Off ...

  5. 刷题-力扣-剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...

  6. 【Java】 剑指offer(14) 二进制中1的个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把 ...

  7. 剑指Offer:二进制中1的个数

    题目:输入一个整数,输出该数二进制表示中1的个数. // 二进制中1的个数 #include <stdio.h> int wrong_count_1_bits(int n) // 错误解法 ...

  8. Go语言实现:【剑指offer】二进制中1的个数

    该题目来源于牛客网<剑指offer>专题. 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1 ...

  9. 《剑指offer》二进制中1的个数

    一.题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 二.牛客网提供的框架 class Solution { public: int NumberOf1(int n) { } ...

随机推荐

  1. 基于Docker的GoldenGate部署

    前言 Docker最近几年异常火爆,主要是因为其方便.快捷.轻量,相对于VM,它不需要占用太多资源,随时可以创建.删除,或在已有image上添加一些软件,再制作成另一个模板image供日后使用.Doc ...

  2. 服务器日志文件Web远程查看

    公司买的一款企业应用软件,所有透过应用操作DB的操作都会生成有日志,日志是以文本文件的形式存放在服务器上,后缀名为*.log.1,*.log.2之类的,软件本身也提供功能查询这些日志,但这个查询的功能 ...

  3. Docker bridge-utils 工具简单部署

    bridge-utils 网桥查看工具 # 1.安装 查看桥接工具 yum install -y bridge-utils # 2.查看桥接 命令brctl show bridge name brid ...

  4. Python爬虫(四)——开封市58同城数据模型训练与检测

    前文参考: Python爬虫(一)——开封市58同城租房信息 Python爬虫(二)——对开封市58同城出租房数据进行分析 Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析 数据的构建 ...

  5. Visual Studio 2015 key 许可证,下载地址

    Visual Studio 2015正式版离线iso及在线下载,附专业版和企业版可用key! Visual Studio Community 2015简体中文版(社区版,针对个人免费): 在线安装ex ...

  6. FSMC_LCD

    1. TFT-LCD(Thin Film Transistor Liquid Crystal Display)[薄膜晶体管液晶显示器] 2. 液晶 物质在熔融状态或在溶液状态下虽然获得了液体物质的流动 ...

  7. 一小时学会 C# 6.0

    一.字符串插值 (String Interpolation) C# 6之前我们拼接字符串时需要这样 var Name = "Jack"; var results = "H ...

  8. css 两端对其

    大段的文字直接写会有不整齐的现象  所以ui小姐姐就会和我们讲你能不能把两端对其呀  ps里面就可以呀 okok  那就两端对其好了 text-align:justify 效果为⬇️⬇️⬇️  上面是 ...

  9. 【Python】【装饰器】

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  10. C#---装箱、拆箱的一个案例

    using System; namespace ConsoleApplication1 { interface IInterface { void Add(int num); } struct Tes ...