《剑指offer》(面试题10):二进制中1的个数

27 篇文章 0 订阅
23 篇文章 0 订阅

位运算

位运算是把数字用二进制表示之后,对每一位上 0 或者 1 的运算。

因为位运算总共只有五种运算:与,或,异或,左移和右移

与(&) 0&0=0     1 & 0 = 0     0 & 1 = 0     1 & 1 = 1
或(|)   0 | 0 = 0     1 | 0 = 1     0 | 1 = 1     1 | 1 = 1
异或(^)     0^0=0     1^0=1     0^1 = 1     1 ^ 1 = 0

左移运算符 m << n 表示把 m 左移 n 位。
左移 n 位 的时候,最左边的 n 位将被丢弃,同时在最右边补上 n 个 0.比如:
00001010 << 2 = 00101000
10001010 << 3 = 01010000

右移运算符 m >> n 表示把 m 右移 n 位。
如果数字原先是一个正数,则右移之后在最左边补 n 个 0;如果数字原先是负数,则右移之后在最左边补 n 个 1.
00001010 >> 2 = 00000010
10001010 >> 3 = 11110001


题目描述:

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

解题思路:

方法一:用1(循环左移)与n的每一位进行位与,来判断1的个数;注意,如果用n进行循环右移,一定要注意负数的情况,因为如果是负数,n右移之后高位补位为1,如果一开始不对n加以判断和处理,就会进入死循环。

方法二:目前我认为最优的解。n=(n-1) & n; 
举个栗子:一个二进制数n为1100,那么n-1为1011,1011&1100=1000,我们会发现,这样操作之后,相当于把n最右边的一个1变为0,那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

方法三:python的解法给了我另一种思路,为什么不用位数作为循环终止条件呢?


python 代码实现:

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        return sum([(n>>i & 1) for i in range(0,32)])


用一条语句判断一个整数是不是 2 的整数次方。一个整数如果是 2 的整数次方,那么它的二进制表示中有且只有一位是 1,而其他所有位都是 0。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值