我刚刚在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如何在内部完成它?
答案 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。哇。