需要帮助理解Python

时间:2018-03-10 00:05:38

标签: python binary converter

或者我猜二进制一般。我对编码显然很陌生,所以我很感激这里的任何帮助。

我刚刚开始学习如何将数字转换为二进制数,特别是二进制数。该课程提供了以下转换代码:

num = 19

if num < 0:
    isNeg = True
    num = abs(num)
else:
    isNeg = False
result = ''
if num == 0:
    result = '0'
while num > 0:
    result = str(num % 2) + result
    num = num // 2
if isNeg:
    result = '-' + result

这给我提出了几个问题,经过一些研究(主要是关于Stack Overflow),我发现自己比以前更加困惑。希望有人可以为我解决一些问题。以下是其中一些问题:

  1. 我认为代码建议只是将-附加到二进制数的前面以显示其否定对应方是完全错误的。看起来bin()做同样的事情,但是你不必翻转这些位并添加1或者其他东西吗?除了让它易于理解/阅读之外,还有其他原因吗?

  2. 正在阅读here并且one of the answers in particular说Python并不是真正适用于两个补码,而是模仿它的其他东西。对我来说,这里的脱节是Python向我展示了一件事,但是以不同的方式存储数字。同样,这只是为了易用吗? bin()是使用两种补码还是Python的方法?

  3. 对那一个的后续行动,&#39;签署数量&#39;上述答案中提到的格式不同于两个补码?

  4. 教授根本没有谈论8位,16位,64位等等,我在阅读这篇文章时看到了很多。这种区别来自哪里,Python使用哪一个?或者那些我可能编码的程序特定的名称?

  5. 很多这些帖子我只引用了Python存储整数的方式。这是否表明它以不同的方式存储浮动,或者它们只是广泛地说话?

  6. 当我写下这一切时,我有点意识到也许我在学习如何游泳之前潜入深渊,但我很好奇,并希望对事物有更深入的了解继续前进。

2 个答案:

答案 0 :(得分:2)

  

我认为代码建议只是在二进制数的前面添加一个 - 以显示其负面对应物是完全错误的。它看起来像bin()做同样的事情,但你不必翻转位并添加1或其他东西?除了让它易于理解/阅读之外,还有其他原因吗?

你必须以某种方式指定数字为负数。您可以添加另一个符号(-),在开头添加一个符号位,使用一个补码,使用二进制补码,或其他一些有效的完全组合方案。数字的二进制和二进制表示都需要固定数量的位,而Python整数则不存在这些位:

>>> 2**1000
1071508607186267320948425049060001810561404811705533607443750
3883703510511249361224931983788156958581275946729175531468251
8714528569231404359845775746985748039345677748242309854210746
0506237114187795418215304647498358194126739876755916554394607
7062914571196477686542167660429831652624386837205668069376

自然的解决方案是只加一个减号。您可以类似地编写自己的bin()版本,要求您指定位数并返回数字的二进制补码表示。

  

正在阅读这里,其中一个答案特别说Python并没有真正起到两个补码的作用,而是模仿它的其他东西。对我来说,这里的脱节是Python向我展示了一件事,但是以不同的方式存储数字。同样,这只是为了易用吗? bin()是使用二进制补码还是Python的方法?

Python是一种高级语言,因此您并不真正了解(或关心)特定Python运行时如何存储整数。无论您使用CPython,Jython,PyPy,IronPython还是其他东西,语言规范只定义它们应该如何表现,而不是如何在内存中表示它们。 bin()只需要一个数字并使用二进制数字打印出来,就像将123转换为base-2一样。

  

对于那个问题的后续行动,上述答案中提到的“符号幅度”格式与两个补码的不同之处是什么?

符号幅度通常将n编号为0bXYYYYYY...,其中X是符号位,YY...是非负幅度的二进制数字。编码为二进制补码的算术由于表示而更加优雅,而符号幅度编码则需要对符号相反的数字进行特殊处理。

  

教授根本没有谈论8位,16位,64位等等,我在阅读这篇文章时看到了很多。这种区别来自哪里,Python使用哪一个?或者那些特定于我可能正在编码的程序的名称?

不,Python没有为其整数定义最大大小,因为它不是那么低级。如果您有足够的内存,2**1000000计算正常,2**10000000也会计算。当您的硬件使您的数字变得更加有利时,会出现 n 位数。例如,处理器具有快速使用32位数字但不能使用87位数字的指令。

  

很多这些帖子我只引用了Python如何存储整数。这是否暗示它以不同的方式存储浮动,或者它们只是广泛地说话?

这取决于Python运行时使用的内容。通常浮点数类似于C double s,但这不是必需的。

答案 1 :(得分:1)

  

你不必翻转这些位并添加1或其他东西吗?

是的,对于两个补码表示法,您将所有位反转并添加一个以获得负对齐。

  

bin()是使用二进制补码还是Python方法?

二进制补码是一种实用的方法来表示电子中只有0和1的负数。在内部,微处理器使用二进制补码表示负数,所有现代微处理器都可以。有关详细信息,请参阅有关计算机体系结构的教科书。

  

上述答案中提到的'符号幅度'格式如何?   不同于两个补充?

您应该查看此代码的作用以及它存在的原因:

while num > 0:
    result = str(num % 2) + result
    num = num // 2