二进制中1的个数
来源:互联网 发布:出柜后父母反对知乎 编辑:程序博客网 时间:2024/06/05 02:32
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解题思路:
因为在2进制中负数是以补码的形式表示的,而由于python中整数是不限制长度的,bin(3)=0b11,bin(-3)=-ob11,无法计算负数中的1的个数,所以可以通过bin(2**32-3)来表示32位的-3的补码形式(这里利用了同余的概念,补码本身也是利用这一概念。),这样就可以计算负数的1的个数了。
解法1:
class Solution: def NumberOf1(self, n): return bin(n).replace("0b","").count("1") if n>=0 else bin(2**32+n).replace("0b","").count("1")
解法2:
class Solution: def NumberOf1(self, n): # 虽然运行通过了,前提是整数是32位的!! count = 0 for i in range(32): if n & 1: count += 1 n = (n >> 1) return count
解法3:
'''直接构建补码,这个也只对32位的有效果'''class Solution: def NumberOf1(self, n): sum = 0 #n < 0 if n < 0: n = (~((-1)*n) + 1) #因为没有符号位,所以如果是32位,则相当于第32位0取反为1,已经可以表示负数的补码了 print("n=%d" % (n)) elif n == 0: return 0 for i in range(0,32): if n & 1 == 1: sum += 1 n >>= 1 return sum
解法4:
class Solution: def NumberOf1(self, n): # write code here count = 0 if n < 0: n = n & (0xFFFFFFFF) #这一步的作用就是限制补码的长度,因为n进行&运算的时候就是用补码,对于-1来讲,不管是多少位,在高位补码都是1,这样运算可以得出表示出补码。 while (n != 0): count+=1 n = n & (n-1) #n-1只会对最后一个1产生影响变为0,1后面的的0全部变成1,当运算后n的值只有最后一位改变,当n不等于0时继续运算,等于0时循环停止,所以在循环开始的时候count可以直接加上1 return count
以上解法全部来自牛客网,我python的答案我没写出来!
阅读全文
0 0
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- Qt之定制个性化系统托盘菜单
- volatile关键字小结
- const 常量
- 关于学业深造以及初入职场有感
- 【第三届蓝桥杯】干支纪年
- 二进制中1的个数
- Cookie和Post模拟登陆
- Hierarchical Convolutional Features for Visual Tracking
- laravel5.1 获取环境变量environment的疑问
- Android 自定义控件之第三讲:obtainStyledAttributes 系列函数详解
- wavecom短信猫发短信的前期配置
- 如何设计一个系统?
- Loadrunner中文乱码问题解决方法总结(loadruner11中文版)
- 普通程序员如何入门深度学习?