17、位运算——二进制中一的个数(python版)

题目描述

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


正数的补码:为原码自身
负数的补码:为原码的符号位不变,数值位按位取反末尾再加一

1、字符法

class Solution:
    def NumberOf1(self, n):
        # write code here
        
        n = 0xFFFFFFFF & n
        count = 0
        for c in str(bin(n)):
            if c == "1":
                count += 1
        return count

注:n = n & 0xFFFFFFFF,在Python中,数的大小是可以无限扩大的,不会像Java或c++中,数超过32位会溢出,而是继续扩张,所以对于一个负数而言,进行了这个操作,实际上是提取了负数的后32位(在计算机中以补码形式存在),前面的任意位呢,则变成了0,比如说 -1,一开始是 111…(n个1)…11111111,进行与运算之后,得到,00…(n个0)…111111111(32个1),变成了含32个1的正数,然后就不用担心负数陷入死循环。再比如复数,最高位1表示负号,但是这么一与,最高位的1不在表示负号,而是表示数值。

2、移位法

class Solution:
    def NumberOf1(self, n):
	    ''' letf shift method
	     count = 0
	     for i in range(32):
	     # 左移法
	     #   mask = 1 << i
	     #   if n & mask != 0:
	     #       count += 1
	     
	     # 右移法
	         count += (n >> i) & 1
	      return count

3、改进移位法

class Solution:
    def NumberOf1(self, n):
        count = 0
        while n:
            n = n & (n-1)
            count += 1
            n = 0xFFFFFFFF & n
        return count 

参考文章:
算法-求二进制数中1的个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰阳星宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值