Я только что начал «продвинутые» этапы курса Python 2.7 на Codeacademy и пошел на дополнительное усилие, пытаясь написать функцию для выполнения ручной побитовой операции OR (|
).Какова внутренняя логика побитового OR (|) оператора Python?
То, что я придумал не самый читаемое решение (поэтому не так 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 внутренне. Выкалывание в репозитории CPython не принесло многого, несмотря на то, что я думаю, что нашел правильный файл (C мне очень чуждо).
То, что я имею в виду по логике, есть, как правило, несколько способов решить любую заданную проблему, и я решил это, передав базовые 2 представления каждого числа в виде строк, создав список, основанный на двоичном формате большей длины, и сравнение каждого символа с предпочтением 1.
Как Python делает это внутри?
Я спрашиваю «по какой логике Python меняет или заменяет каждый бит». Я понимаю, что это делает, теперь я хочу знать, как **. – GrayedFox
Я уверен, что в итоге он просто переводит его в низкоуровневую инструкцию CPU. –
Итак, вы спрашиваете, как заменить биты? Возьмем '100101' в качестве примера. '100101 | 011101' '' 111101'. Если бит равен 1, то полученный бит равен 1. – Li357