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



题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
python实现:
# -*- coding:utf-8 -*-
class Solution:
    # 法1:最右端和1相与,然后n不断除以2,但不要用while n>0作为判断条件,
    # 因为还要考虑n为负数时的情况
    def NumberOf12(self, n):
        # write code here
        cnt = 0
        # 不要用while n>0作为判断条件
        for i in range(32): 
            if n & 0x1 == 1:
                cnt += 1
            n = n//2
        return cnt

    # 法2:除法改为右移,但不要用while n!=0作为判断条件
    # 因为n为负数时,右移左端会补1
    def NumberOf13(self, n):
        # write code here
        cnt = 0
        for i in range(32): 
            if n & 0x1 == 1:
                cnt += 1
            n = n>>1
        return cnt
    
    # 法3:右移改为左移,不过不是移n,而是移mask
    def NumberOf14(self, n):
        # write code here
        cnt = 0
        mask = 0x1
        for i in range(32): 
            if n & mask: # 注意别写成n & mask == 1
                cnt += 1
            mask = mask<<1
        return cnt
    
    # 法4:使用v&(v-1),总能消去右边开始的第一个1
    def NumberOf15(self, n):
        cnt = 0
        n = n & 0xffffffff  # 将python里的负数 变成无符号数
        while n:
            cnt += 1
            n = n&(n-1)
        return cnt
    
    # 法5:使用bin()方法
    def NumberOf1(self, n):
        n = n & 0xffffffff # 将python里的负数 变成无符号数
        return bin(n).count('1')


     
    #注意:python 的整数不是32位,而是位数可以一直增大,所以下面的代码会陷入死循环
    # 即左移并不会使得flag变为0
    """
    def NumberOf1(self, n):
        flag = 0x1
        cnt = 0
        #n = n&0xffffffff#python里的负数 变成无符号数
        while flag:
            if n&flag:
                cnt += 1
            flag <<= 1
        return cnt
    """
c++实现:
class Solution {
public:
    //法1
     int  NumberOf12(int n) {
         int flag=1, cnt=0;
         while(flag){
             if(flag&n)
                 cnt++;
             flag <<= 1;
         }
         return cnt;
     }
    //法2
    int  NumberOf1(int n) {
        int cnt=0;
        while(n){
            cnt++;
            n=n&(n-1);
        }
        return cnt;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值