二进制中1的个数

输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
机器码/机器数:机器数是带符号的, 计算机字长为8位,转换成二进制就是00000011;-3 ,就是 10000011。这里的 00000011 和 10000011 就是机器数。
真值:因为第一位是符号位,所以机器数的形式值就不等于真正的数值。为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位,所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111],即[-127 , 127]
反码:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
补码:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1 (即在反码的基础上+1)。
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
【1】判断数字n二进制的最右一位是不是1:n&1
循环右移 n=n>>1:判断 n&1 技术

class Solution:
    def NumberOf1(self, n):
        # write code here
        count_1 = 0
        i = 32
        while(i):
            if(n&1):
                count_1 += 1
            n = n>>1
            i-=1
        return count_1

但是此方法有个问题就是没法判单复数:因为移位前是一个负数,要保证移位后也是一个负数,移位后最高位要设为1,一直右移,会变成111111111111,陷入死循环。
上面的代码在循环条件写死32,所以没问题
【2】既然不能移位数字,那就移位flag, n&1,n&2,n&4,n&8 …
循环的次数是整数二进制的位数

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        count_1 = 0
        flag = 1
        i = 32
        while(i):
            if (n&flag):
                count_1 += 1
            flag = flag<<1
            i -= 1
        return count_1

# -*- coding:utf-8 -*-
from ctypes import *
class Solution:
    def NumberOf1(self, n):
        # write code here
        count_1 = 0
        flag = 1
        while c_int(flag).value:
            if c_int(n&flag).value:
                count_1+=1
            flag = flag<<1
        return count_1

【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,就可以进行多少次这样的操作。

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        count_1 = 0
        while(n!=0):
            count_1 += 1
            n = n&(n-1)
        return count_1

运行超时,应该是循环条件的问题,python中二进制表示是不是有啥特殊的?

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        if n>=0:
            return bin(n).count("1") 
        else:
            return bin(2**32+n).count("1")

https://www.cnblogs.com/cotyb/archive/2016/02/11/5186461.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值