2016-10-07 2 views
0

Я только что начал «продвинутые» этапы курса 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 делает это внутри?

+0

Я спрашиваю «по какой логике Python меняет или заменяет каждый бит». Я понимаю, что это делает, теперь я хочу знать, как **. – GrayedFox

+0

Я уверен, что в итоге он просто переводит его в низкоуровневую инструкцию CPU. –

+0

Итак, вы спрашиваете, как заменить биты? Возьмем '100101' в качестве примера. '100101 | 011101' '' 111101'. Если бит равен 1, то полученный бит равен 1. – Li357

ответ

0

Этот вопрос, к неподготовленным глазам (кто-то, не имеющий информатики), пытается понять реализацию C побитовой операции на Python.

Однако после нескольких исследований я понял, что вопрос, к обученному глазу, может показаться абсурдным, поскольку на самом деле это the processor itself, который понимает этот тип операции.

Это означает, что внутренняя логика операции поразрядного ИЛИ на Python полностью равна dependent on the instructions available to the CPU, то есть не зависит от языка более высокого уровня.

Таким образом, внутренняя логика побитового оператора OR на Python выполняет сравнение по битам (1 и 0) рассматриваемой машины и как она выполняет эту операцию, является прямым сравнением упомянутых битов, которые, разумно, not dissimilar to how Ancient Egyptians performed multiplication. Ого.

1

Оператор OR похож на параллельную электрическую схему с двумя маршрутами, даже если один из маршрутов сломан, ток все равно будет протекать. Он останавливается только при нарушении обоих маршрутов. Но вы должны быть осторожны с оператором OR в python, хотя это выглядит просто, логика должна решаться очень тщательно, иначе вам может быть очень сложно отладить ваш код.

+0

Это хорошая аналогия, однако не совсем ответит на вопрос, который я сейчас обновил, чтобы быть более четким. Но, несмотря на это, спасибо – GrayedFox

Смежные вопросы