首页 > 编程知识 正文

剑指offer java,python快速编程入门第二版黑马答案

时间:2023-05-05 19:59:04 阅读:36609 作者:4843

主题说明

输入整数,输出该数的二进制表示中的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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。