Python按位OR(|)运算符的内部逻辑是什么?

时间:2016-10-07 16:56:47

标签: python-2.7 binary internals

我刚刚在Codeacademy上开始了Python 2.7课程的“高级”阶段,并且尝试编写一个函数来执行手动按位OR(|)操作。

我想出的并不是最易读的解决方案(所以不是Pythonic)......

def bitwiseOr(bin1, bin2):
    """Perform a bitwise OR swap of two string representations of a binary number"""

    # if the second bit is larger (in length), swap them
    if len(bin1) < len(bin2):
        bin1, bin2 = bin2, bin1

    # cast string into list using list comprehension
    result = [x for x in bin1]
    resultString = ""

    # start at the end of the smallest length bit string, 
    # moving backwards by 1 char, and stop at the 2nd char
    for i in range(len(bin2), 2, -1):        
        if bin2[i-1] == "1":
            result[i] = bin2[i-1]

    # convert the list back into a string
    for item in result:
        resultString += item        

    return resultString


print bin(0b1110 | 0b101)
print bitwiseOr("0b101", "0b1110")

以上两个print调用都返回相同的结果(虽然第一次调用返回二进制数,第二次返回二进制数的字符串表示)。

除了可读性之外 - 我很有兴趣在内部通过Python了解它是如何逻辑完成的。尽管我认为我找到了正确的文件(C对我来说非常陌生),但在CPython存储库中进行搜索并没有产生太大的影响。

逻辑上我的意思是,通常有几种方法可以解决任何给定的问题,我通过将每个数字的基数2表示作为字符串传递来解决这个问题,创建基于较大长度二进制的列表,以及比较每个字符,引用1。

Python如何在内部完成它?

2 个答案:

答案 0 :(得分:1)

OR运算符就像一条有两条路径的并联电路,即使其中一条路线断开,电流仍然会流过。它只在两条路线都被破坏时停止。但是你必须小心python中的OR运算符,虽然它看起来很简单,逻辑必须非常仔细地决定,否则你可能很难调试你的代码。

答案 1 :(得分:0)

对于未经训练的人(没有计算机科学背景的人)来说,这个问题是试图理解Python的按位OR运算的C实现。

然而经过一些更多的研究后,我已经意识到这个问题,对于训练有素的人来说,可能看起来很荒谬,因为实际上the processor itself了解这种类型的操作。

这意味着Python按位OR运算的内部逻辑实际上完全是dependent on the instructions available to the CPU,也就是说,它不依赖于更高级别的语言。

总而言之,Python按位OR运算符的内部逻辑对所讨论的机器的位(1和0)进行比较,以及它如何执行此操作是对所述位的直接比较, - 慢慢地,是not dissimilar to how Ancient Egyptians performed multiplication。哇。