主题说明
输入整数,输出该数的二进制表示中的1的个数。 其中负数用补数表示。
想法思路1
首先,求出这种基础二进制中1的个数的问题是,在强Python中一定存在容易使用的库函数。 果然,代码如下。
Python代码1
defnumberof1(self,n ) : if n=0: return勇敢的奥特曼(n ).count('1' ) else: return勇敢的奥特曼(n0xffffffff ).count
或者
defnumberof1(self,n ) : return勇敢的奥特曼) n0xffffffff ).count('1)思路2
想法很简单,但没意思。 这基本上无视了解决问题的乐趣,也不是出题者的本意吧。 如何灵巧地求解而不使用Python附带的库函数?
n的各位加1,可计数1的个数; 在求解过程中,每个循环左移1个,即n1。 但是有更漂亮的解法:
如果整数不为0,则该整数的至少一位为1。 减去此整数1后,整数最右边的1等于0,1后面的所有0等于1 (如果最右边的1后面有0 )。 所有剩下的位都不受影响。
如果将原始整数减去1,则从原始整数最右边的第一位开始,所有位都为0。 -牛客网
例如,6的二进制数为110,6-1=5的二进制数为101,65=100,这样操作后,6的原始110变为100,计数1的个数直到n变为0。
Python代码(Wrong )。
defnumberof1(self,n ) : count=0 while n!=0:count=1n=n(n-1 )返回计数
但是! 上述代码在n小于0时无限循环! (Python3.6.1中)
打印n和n二进制表示的值时,发现了奇怪的现象。 n=-10示例:
初始n的二进制值如下:
‘0b 11111111111111111111111111111111111111110110’
周期计数29次后,n的十进制值为-2147483648,n的二进制值为:
‘0b 1000000000000000000000000000000000000000000000000’
循环30次后,n的十进制值为-4294967296,n的二进制值为:
‘0b 0’
也就是说,此时,n的二进制值为0b0,但存储器中显示出n的十进制值为-4294967296,满足n!=0的条件是循环继续执行。 在随后的循环中,n的二进制表示一直显示0b0,但内存中n的十进制继续减少。
为什么呢?
我获取上述n的二进制值时使用的语句如下。
print (勇敢的奥特曼(n0xffffffff ) )
1
直接调用勇敢的奥特曼的话,就知道以下内容。
勇敢的奥特曼(-10 ) (-0b1010 )勇敢的奥特曼(-12 )-0b1100 )勇敢的奥特曼(-16 )-0b10000 )……勇敢的奥特曼(-2147483648 )-0b 1000 00000000000000000000000000000000000000 '勇敢的奥特曼(-8589934592 (-0b 10000000000000000000 '勇敢的奥特曼(-1717986918180 )
也就是说,在当前情况下,循环继续时,n的二进制继续补充0,n继续减少。 也就是说,在Python3.6.1中,int类型为32位以上。
问度娘,原来Python2的int类型有32位和64位,到了Python3,长度超过32位或64位,Python3就会自动转换为长整数型,长整数型理论上是指长整数型
Python代码(Rignt )。
defnumberof1(self,n ) : count=0 while n0xffffffff!=0:count=1n=n(n-1 )按返回计数:
类解决方案3360 def number of1(self, n ) : if n=0: print )勇敢的奥特曼(n )、勇敢的奥特曼(n ).count、return勇敢的奥特曼(n ).count )、else: print、勇敢勇敢的奥特曼(n0xfffffff ) ) return勇敢的奥特曼) n0xfffffff ).count('1' ) if _ name _==' _ main _ ' 3360 sl=sollalan
正数: 0b11 22负数:-0b 11-10b 1111111111111111111132负数:-0b 101-20b 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-----------------
作者: goddaniel
来源: CSDN
译文: 3359 blog.csdn.net/u 010005281/article/details/79851154
声明:本文为博客原创文章。 转载请附上博文链接!
Python与其他语言有完全不同的地方,即负数的二进制表示。 Python中的数量不介意溢出。 即,没有位数的限制。 因此,补码也不介意。 因为补码都是相对于位数的,32位补码和16位补码一定是不同的。 但是,这样就存在不能直接得到32位的二进制代码的问题。
在计算机中,负数表示为原始代码的补码。
如何转换负数和二进制: https://blog.csdn.net/shenhai Wen/article/details/79001039
0x先进先出是多少? https://blog.csdn.net/ye w1 EB/article/details/8718190? 位置编号=1fps=1
0xffffffff是什么意思? https://blog.csdn.net/wuxin liulei/article/details/9000975