Понимание PHP и (амперсанд, поразрядно и) оператор

Все зависит от some_transform и запроса.

Если эта функция имеет значение IMMUTABLE (гарантированно возвращает тот же результат для тех же аргументов) или STABLE (возвращает тот же результат для того же аргумента в течение текущего запроса и не изменяет базу данных) Вы можете пометить свою функцию так же.

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

Функция IMMUTABLE будет оцениваться при планировании запроса, функция STABLE - один раз во время выполнения.

Это поможет вам с запросом, подобным

WHERE a.x = some_text_predicate('const')

, но не с

WHERE some_text_predicate(a.x) = 'const'

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

Если вы не можете избежать частого вызова функции, вторая функция может быть лучше, потому что функции PL / pgSQL кэшируют планы выполнения. Но вы не можете избежать того, что дорогая функция вызывается таким образом несколько раз.

60
задан Peter Mortensen 1 December 2015 в 18:32
поделиться

5 ответов

& двоичный and. Если у Вас будете двоичное значение и Вы and с другим двоичным значением, то результатом будет поразрядное and из двух. Пример:

  01101010
& 01011001
= 01001000

самый правый бит является любой 1 (и в этом случае число является нечетным числом), или это - 0, в этом случае число является четным. Если Вы & число с 1, Вы только смотрите на наименее значимый бит, и, если проверки, если число является 1 или 0. Как другие упомянули, посмотрите на побитовые операторы для получения информации о том, как они работают.

60
ответ дан Marius 24 November 2019 в 17:40
поделиться

Две операции, которые фундаментальны для двоичных систем счисления, ИЛИ и И.

ИЛИ означает, 'если или A идет или B, идет'. Примером реального мира были бы два переключателя параллельно. Если любой позволяет текущий через, то текущие передачи через.

И означает, 'если и A и B идут'. Примером реального мира являются два переключателя последовательно. Текущий только пройдет, если оба позволят текущий через.

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

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

Именно поэтому:

00011011 (odd number)
AND
00000001 (& 1)
== 
00000001 (results in 1)

принимая во внимание, что

00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)

(& 1) операция поэтому сравнивает самый правый бит с 1 использованием И логикой. Все другие биты эффективно проигнорированы, потому что что-либо И ничто - ничто. Четное число в двоичном файле является также четным числом в десятичной записи (10, является кратным 2).

Другие фундаментальные операции к двоичным системам счисления включают НЕ и XOR. НЕ означает, 'если A прочь' и является единственной формой логического элемента, который берет только сигнал единицы или 'параметр' вместо два. XOR означает, 'если или A или B идут, но не оба'. И затем существует NAND, NOR и NXOR, которые в основном просто НЕ объединены с И, ИЛИ, и XOR, т.е. средства NAND, 'если A и B не оба на'.

В программировании, оператор

& means AND,
| means OR, 
~ means NOT, and
^ means XOR.

Другие могут быть составлены путем объединения их, например:

~ (a & b) is equivalent to a NAND operation

определенные Побитовые операторы примечания

PHP не работают над значениями с плавающей точкой, и в плавании PHP значения будут неявно преобразованы в целые числа сначала. Числа вне диапазона, который может быть выражен как целые числа, будут усеченными для обнуления - то есть, все числа по PHP_INT_MAX посмотрят "даже" в выражении ($num & 1)). Если Вы захотите поддерживать числа за пределами PHP_INT_MIN/PHP_INT_MAX, то Вам будет нужно fmod($num, 2). , Если, однако, Вы находитесь на 64-разрядном PHP, Ваши целые числа будут иметь большую точность, чем плавания так или иначе.

27
ответ дан thomasrutter 24 November 2019 в 17:40
поделиться

Это также интересно знать о поразрядном и PHP:

/**
 * Regular
 */
echo (true && true); // 1
echo (true && false); // nothing

echo (true || false); // 1
echo (false || false); // nothing

echo (true xor false); // 1
echo (false xor false); // nothing

/**
 * Bitwise
 */
echo (true & true); // 1
echo (true & false); // 0

echo (true | false); // 1
echo (false | false); // 0

echo (true ^ false); // 1
echo (false ^ false); // 0
19
ответ дан Peter Mortensen 24 November 2019 в 17:40
поделиться

Я знаю, что Ваш вопрос о понимании побитового оператора, и принятый ответ объясняет это хорошо. Но для примера Вы даете, я не могу не рекомендации, Вы используете оператор по модулю вместо этого:

($var % 2) /* instead of */ ($var & 1)

, поскольку это делает намерение ясным, что Вы проверяете, что число нечетно (не делимый два), и это более универсально, таким образом, можно использовать (% $var 3) тот же путь и вывести, как это работает на любой N.

13
ответ дан alex 24 November 2019 в 17:40
поделиться

в дополнение к другим ответам Стоит отметить, что

if(func1() && func2())

будет звонить только Func2 () , если Func1 () возвращает True («ленивая оценка»), тогда как

if(func1() & func2())

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


Точны Томасруттертер (в комментариях ниже), что вы, вероятно, не должны делать последнее на практике. (A & B) не обязательно будет иметь такую ​​же правду, что и (A && B) , особенно когда A и B целые числа. E.G., если A = 1 и B = 2 (как правда), A & B будет ложным, тогда как A && B - это правда. Кроме того, другой разработчик может подумать, что это опечатка и «исправьте» к двум амперсандам.

13
ответ дан 24 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

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