что делает это? python --- & gt; печать (5 | 3) [дубликат]

Js - однопоточная.

Браузер можно разделить на три части:

1) Event Loop

2 ) Web API

3) Очередь событий

Событие Loop запускается вечно, т. Е. Тип бесконечного цикла. Очередь ожидания - это то, где вся ваша функция нажимается на какое-либо событие (пример: нажмите) this один за другим выполняется в очереди и помещается в цикл «Событие», который выполняет эту функцию и подготавливает ее для следующего после первого запуска. Это означает, что выполнение одной функции не начинается до тех пор, пока функция, перед которой она в очереди не будет выполнена цикл событий.

Теперь давайте подумаем, что мы поставили две функции в очереди, чтобы получить данные с сервера, а другой использует эти данные. Мы сначала нажали функцию serverRequest () в очереди, а затем применили функцию Data () , Функция serverRequest переходит в цикл событий и делает вызов на сервер, так как мы никогда не знаем, сколько времени потребуется для получения данных с сервера, поэтому ожидается, что этот процесс займет много времени, и поэтому мы заняли наш цикл событий, тем самым повесив нашу страницу, вот где Web API входит в эту роль, он принимает эту функцию из цикла событий и обращается к серверу, создающему цикл событий, так что мы можем выполнить следующую функцию из очереди. Следующая функция в очереди - useData (), которая идет в цикле, но из-за отсутствия данных отходы и выполнение следующей функции продолжаются до конца очереди (это называется Async-вызовом, то есть мы можем сделать что-то еще, пока не получим данные)

Предположим, что наша функция serverRequest () имела оператор возврата в код, когда мы возвращаем данные с сервера Web API, будет выталкивать его в очередь в конце очереди. По мере того, как он заканчивается в очереди, мы не можем использовать его данные, поскольку в нашей очереди нет функции, чтобы использовать эти данные. Таким образом, невозможно вернуть что-то из Async Call.

Таким образом, решение этой проблемы callback или обещают .

A Изображение из одного из ответов здесь, правильно объясняет использование обратного вызова ... Мы (функция, использующая данные, возвращаемые с сервера), чтобы вызвать вызывающий сервер.

 function doAjax(callbackFunc, method, url) {
  var xmlHttpReq = new XMLHttpRequest();
  xmlHttpReq.open(method, url);
  xmlHttpReq.onreadystatechange = function() {

      if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) {
        callbackFunc(xmlHttpReq.responseText);
      }


  }
  xmlHttpReq.send(null);

}

В моем коде он называется

function loadMyJson(categoryValue){
  if(categoryValue==="veg")
  doAjax(print,"GET","http://localhost:3004/vegetables");
  else if(categoryValue==="fruits")
  doAjax(print,"GET","http://localhost:3004/fruits");
  else 
  console.log("Data not found");
}

Прочитайте здесь новые методы в ECMA (2016/17) для создания асинхронного вызова (@Felix Kling Answer сверху) https://stackoverflow.com/a/14220323/7579856

82
задан Peter Mortensen 25 October 2014 в 13:39
поделиться

13 ответов

Побитовые операторы - это операторы, которые работают с несколькими битовыми значениями, но концептуально по одному бит за раз.

  • AND равно 1, только если как входы 1, в противном случае - 0.
  • OR равно 1, если один или оба его входов равны 1, в противном случае это 0.
  • XOR равно 1, только если ровно один его входов равен 1, в противном случае оно равно 0.
  • NOT равно 1, только если его вход равен 0, в противном случае это 0.

Их часто можно лучше всего показать как таблицы истинности. Входные возможности находятся сверху и слева, результирующий бит является одним из четырех (два в случае NOT, поскольку он имеет только один вход), показанных на пересечении входов.

AND | 0 1     OR | 0 1     XOR | 0 1    NOT | 0 1
----+-----    ---+----     ----+----    ----+----
 0  | 0 0      0 | 0 1       0 | 0 1        | 1 0
 1  | 0 1      1 | 1 1       1 | 1 0

Например, если вы хотите только младшие 4 бита целого числа, вы И его с 15 (двоичный код 1111), так:

    201: 1100 1001
AND  15: 0000 1111
------------------
 IS   9  0000 1001

Нулевые биты в 15 в этом случае эффективно действуют как фильтр, заставляя биты в результате также иметь нуль.

Кроме того, >> и << часто включаются как побитовые операторы, и они «сдвигают» значение соответственно справа и слева от определенного количество бит, отбрасывание битов, которые катят конец, на который вы смещаетесь, и подача нулевых бит на другом конце.

Итак, например:

1001 0101 >> 2 gives 0010 0101
1111 1111 << 4 gives 1111 0000

Обратите внимание, что сдвиг влево в Python необычен тем, что он не использует фиксированную ширину, где биты отбрасываются, - хотя многие языки используют фиксированную ширину на основе типа данных, Python просто расширяет ширину, чтобы обслуживать дополнительные биты. Чтобы получить отбрасывающее поведение в Python, вы можете следовать сдвигу влево с поразрядным and, например, в 8-битном значении, сдвигающем влево четыре бита:

bits8 = (bits8 << 4) & 255

Учитывая это, другой пример побитовых операторов - если у вас есть два 4-битных значения, которые вы хотите упаковать в 8-разрядный, вы можете использовать все три из ваших операторов (left-shift, and и or):

packed_val = ((val1 & 15) << 4) | (val2 & 15)
  • Операция & 15 будет обеспечивать, чтобы оба значения имели только младшие 4 бит.
  • << 4 - это 4-битный сдвиг влево для перемещения val1 в верхние 4 бита 8-битного значения.
  • | просто объединяет эти два вместе.

Если val1 равно 7 и val2 равно 4:

                val1            val2
                ====            ====
 & 15 (and)   xxxx-0111       xxxx-0100  & 15
 << 4 (left)  0111-0000           |
                  |               |
                  +-------+-------+
                          |
| (or)                0111-0100
131
ответ дан paxdiablo 5 September 2018 в 07:36
поделиться

В этом примере будут показаны операции для всех четырех двухбитовых значений:

10 | 12

1010 #decimal 10
1100 #decimal 12

1110 #result = 14

10 & 12

1010 #decimal 10
1100 #decimal 12

1000 #result = 8

Вот один пример использования:

x = raw_input('Enter a number:')
print 'x is %s.' % ('even', 'odd')[x&1]
3
ответ дан dansalmo 5 September 2018 в 07:36
поделиться

Другим распространенным прецедентом является манипулирование / проверка прав доступа к файлам. См. Модуль stat Python: http://docs.python.org/library/stat.html .

Например, чтобы сравнить разрешения файла с желаемым набором разрешений, вы могли бы сделать что-то вроде:

import os
import stat

#Get the actual mode of a file
mode = os.stat('file.txt').st_mode

#File should be a regular file, readable and writable by its owner
#Each permission value has a single 'on' bit.  Use bitwise or to combine 
#them.
desired_mode = stat.S_IFREG|stat.S_IRUSR|stat.S_IWUSR

#check for exact match:
mode == desired_mode
#check for at least one bit matching:
bool(mode & desired_mode)
#check for at least one bit 'on' in one, and not in the other:
bool(mode ^ desired_mode)
#check that all bits from desired_mode are set in mode, but I don't care about 
# other bits.
not bool((mode^desired_mode)&desired_mode)

Я приводил результаты как логические значения, потому что я только забочусь об истине или ложности, но было бы целесообразным вывести значения bin () для каждого один.

2
ответ дан dbn 5 September 2018 в 07:36
поделиться

Я думаю, что вторая часть вопроса:

Кроме того, для чего используются побитовые операторы? Я был бы признателен за некоторые примеры.

Был только частично рассмотрен. Это мои два цента по этому вопросу.

Побитовые операции в языках программирования играют фундаментальную роль при работе с множеством приложений. Практически все низкоуровневые вычисления должны выполняться с использованием таких операций.

Во всех приложениях, которые должны отправлять данные между двумя узлами, такими как:

  • компьютерные сети;
  • телекоммуникационные приложения (сотовые телефоны, спутниковая связь , и т. д.).

На уровне связи нижнего уровня данные обычно отправляются в так называемых кадрах. Фреймы - это просто строки байтов, которые отправляются через физический канал. Эти кадры обычно содержат фактические данные плюс некоторые другие поля (закодированные в байтах), которые являются частью того, что называется заголовком. Заголовок обычно содержит байты, которые кодируют некоторую информацию, связанную с состоянием связи (например, с флагами (битами)), счетчики кадров, коды коррекции и обнаружения ошибок и т. Д. Чтобы получить переданные данные в кадре и построить кадры для отправки данных, вам понадобятся наверняка побитовые операции.

В общем, при работе с такими приложениями API доступен, поэтому вам не нужно разбираться со всеми этими деталями. Например, все современные языки программирования предоставляют библиотеки для соединений сокетов, поэтому на самом деле вам не нужно создавать кадры связи TCP / IP. Но подумайте о хороших людях, которые запрограммировали эти API для вас, им наверняка пришлось иметь дело с рамочной конструкцией; используя все виды побитовых операций для перехода от низкоуровневой связи к высокоуровневой связи.

Как конкретный пример, представьте, что кто-то дает вам файл, который содержит необработанные данные, которые были захвачены напрямую с помощью телекоммуникационного оборудования. В этом случае, чтобы найти кадры, вам нужно будет прочитать необработанные байты в файле и попытаться найти какие-то слова синхронизации, сканируя данные по частям. После определения слов синхронизации вам нужно будет получить фактические кадры и, если необходимо, SHIFT их (и это только начало истории), чтобы получить фактические данные, которые передаются.

Еще одна очень различное семейство приложений низкого уровня - это когда вам нужно управлять оборудованием, используя некоторые (древние) порты, такие как параллельные и последовательные порты. Эти порты управляются путем установки некоторых байтов, и каждый бит этих байтов имеет конкретное значение с точки зрения инструкций для этого порта (см., Например, http://en.wikipedia.org/wiki/Parallel_port ). Если вы хотите создать программное обеспечение, которое что-то делает с этим оборудованием, вам понадобятся побитовые операции для перевода инструкций, которые вы хотите выполнить, в байты, которые порт понимает.

Например, если у вас есть некоторые физические кнопки, подключенные к параллельному порту для управления другим устройством, это строка кода, которую вы можете найти в мягком приложении:

read = ((read ^ 0x80) >> 4) & 0x0f; 

Надеюсь, что это поможет.

7
ответ дан eguaio 5 September 2018 в 07:36
поделиться

следующие побитовые операторы: & amp; , | , ^ и ~ возвращаемые значения (основанные на их вход) аналогичным образом логические ворота влияют на сигналы. Вы можете использовать их для эмуляции цепей.

0
ответ дан Erik Waters 5 September 2018 в 07:36
поделиться

Я не видел, чтобы это упоминалось. Этот пример покажет вам (-) десятичную операцию для двух битовых значений: AB (только если A содержит B)

эта операция необходима, когда мы держим глагол в наша программа, представляющая биты. иногда нам нужно добавить биты (например, выше), и иногда нам нужно удалить биты (если глагол содержит тогда)

111 #decimal 7
-
100 #decimal 4
--------------
011 #decimal 3

с python: 7 & amp; ~ 4 = 3 (удалить из 7 битов, которые представляют 4)

001 #decimal 1
-
100 #decimal 4
--------------
001 #decimal 1

с python: 1 & amp; ~ 4 = 1 (удалить из 1 битов, которые представляют 4 - в этом случае 1 не «содержит» 4) ..

1
ответ дан Eyal Ch 5 September 2018 в 07:36
поделиться

Я не видел упоминания выше, но вы также увидите, что некоторые люди используют левый и правый сдвиг для арифметических операций. Левый сдвиг на x эквивалентен умножению на 2 ^ x (пока он не переполняется), а правый сдвиг эквивалентен делению на 2 ^ x.

Недавно я видел людей, использующих x & lt; 1 и x >> 1 для удвоения и сокращения пополам, хотя я не уверен, что они просто стараются быть умными или действительно есть отличное преимущество над нормальными операторами.

4
ответ дан P. Stallworth 5 September 2018 в 07:36
поделиться

Бит-представления целых чисел часто используются в научных вычислениях для представления массивов истинной-ложной информации, потому что побитовая операция выполняется намного быстрее, чем итерация через массив булевых. (Языки более высокого уровня могут использовать идею бит-массива.)

Приятным и довольно простым примером этого является общее решение игры Nim. Взгляните на код Python на странице на странице Википедии . Он сильно использует побитовое исключение или ^.

34
ответ дан Peter Mortensen 5 September 2018 в 07:36
поделиться

Хотя манипуляция битами целого числа полезна, часто для сетевых протоколов, которые могут быть указаны до бита, может потребоваться манипуляция более длинными байтовыми последовательностями (которые нелегко преобразовать в одно целое). В этом случае полезно использовать библиотеку bitstring , которая позволяет выполнять побитовые операции с данными - например, можно импортировать строку «ABCDEFGHIJKLMNOPQ» в виде строки или в виде шестнадцатеричного и битового сдвига (или выполнять другие побитовые операции):

>>> import bitstring
>>> bitstring.BitArray(bytes='ABCDEFGHIJKLMNOPQ') << 4
BitArray('0x142434445464748494a4b4c4d4e4f50510')
>>> bitstring.BitArray(hex='0x4142434445464748494a4b4c4d4e4f5051') << 4
BitArray('0x142434445464748494a4b4c4d4e4f50510')
0
ответ дан Pierz 5 September 2018 в 07:36
поделиться

Подумайте о 0 как false и 1 как истина. Затем побитовые и (& amp;) и / или (|) работают так же, как и обычные, и / или только за исключением того, что все биты в значении сразу. Как правило, вы увидите, что они используются для флагов, если у вас есть 30 параметров, которые можно установить (например, стили рисования в окне), которые вы не хотите передавать в 30 отдельных логических значениях, чтобы установить или отключить их, чтобы вы использовали | для объединения опций в одно значение, а затем вы используете & amp; чтобы проверить, установлена ​​ли каждая опция. Этот стиль прохождения флага сильно используется OpenGL. Поскольку каждый бит является отдельным флагом, вы получаете значения флага по степеням двух (или числа, которые имеют только один бит) 1 (2 ^ 0) 2 (2 ^ 1) 4 (2 ^ 2) 8 (2 ^ 3) мощность двух указывает, какой бит установлен, если флаг включен.

Также обратите внимание на 2 = 10, так что x | 2 равно 110 (6) не 111 (7) Если ни один из битов не перекрывается (что true в этом случае) | действует как дополнение.

5
ответ дан stonemetal 5 September 2018 в 07:36
поделиться

Наборы

Наборы можно комбинировать с помощью математических операций.

  • Объединенный оператор | объединяет два набора, чтобы сформировать новый, содержащий элементы в любом из них.
  • Оператор пересечения & получает элементы только в обоих.
  • Оператор разницы - получает элементы в первом наборе, но не во втором.
  • Симметричный разностный оператор ^ получает элементы в любом наборе, но не оба.

Попробуйте сами:

first = {1, 2, 3, 4, 5, 6}
second = {4, 5, 6, 7, 8, 9}

print(first | second)

print(first & second)

print(first - second)

print(second - first)

print(first ^ second)

Результат :

{1, 2, 3, 4, 5, 6, 7, 8, 9}

{4, 5, 6}

{1, 2, 3}

{8, 9, 7}

{1, 2, 3, 7, 8, 9}
0
ответ дан tk3 5 September 2018 в 07:36
поделиться

Может быть лучший способ найти, где элемент массива находится между двумя значениями, но, как показывает этот пример, здесь работает & amp; , тогда как и не .

import numpy as np
a=np.array([1.2, 2.3, 3.4])
np.where((a>2) and (a<3))      
#Result: Value Error
np.where((a>2) & (a<3))
#Result: (array([1]),)
1
ответ дан woodfoot 5 September 2018 в 07:36
поделиться

, для чего используются побитовые операторы? Я был бы признателен за некоторые примеры.

Одним из наиболее распространенных применений побитовых операций является разбор шестнадцатеричных цветов.

Например, здесь Python , которая принимает строку типа #FF09BE и возвращает кортеж ее значений красного, зеленого и синего.

def hexToRgb(value):
    # Convert string to hexadecimal number (base 16)
    num = (int(value.lstrip("#"), 16))

    # Shift 16 bits to the right, and then binary AND to obtain 8 bits representing red
    r = ((num >> 16) & 0xFF)

    # Shift 8 bits to the right, and then binary AND to obtain 8 bits representing green
    g = ((num >> 8) & 0xFF)

    # Simply binary AND to obtain 8 bits representing blue
    b = (num & 0xFF)
    return (r, g, b)

Я знаю, что есть более эффективные способы добиться этого, но я верю что это очень краткий пример, иллюстрирующий как сдвиги, так и побитовые логические операции.

33
ответ дан Zizouz212 5 September 2018 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: