PHP & (앰퍼샌드, 비트 및) 연산자 이해
나는 종종 ($var & 1)
내 코드에서 사용하는데 $var
, 홀수 이면 true 를, 짝수이면 false를 반환합니다.
그러나 "&"는 실제로 무엇을합니까?
&는 바이너리 and
입니다. 이진 값이 and
있고 다른 이진 값이있는 경우 결과는 둘 중 비트 단위 and
가됩니다. 예 :
01101010
& 01011001
= 01001000
맨 오른쪽 비트는 1 (이 경우 숫자는 홀수)이거나 0 (이 경우 숫자는 짝수)입니다. &
1 이 있는 숫자 인 경우 최하위 비트 만보고, if는 숫자가 1인지 0인지 확인합니다. 다른 사람들이 언급했듯이 작동 방식에 대한 정보는 비트 연산자를 참조하세요.
바이너리 시스템의 기본이되는 두 가지 연산은 OR과 AND입니다.
OR는 'A가 켜져 있거나 B가 켜져 있으면'을 의미합니다. 실제 사례는 병렬로 연결된 두 개의 스위치입니다. 둘 중 하나가 전류를 통과하면 전류가 통과합니다.
AND는 'A와 B가 모두 켜져있는 경우'를 의미합니다. 실제 사례는 직렬로 연결된 두 개의 스위치입니다. 둘 다 전류를 허용하는 경우에만 전류가 통과합니다.
컴퓨터에서 이들은 물리적 스위치가 아니라 반도체이며 그 기능을 로직 게이트 라고 합니다. 그들은 스위치와 같은 종류의 일을합니다-전류에 반응하거나 전류가 없습니다.
정수에 적용하면 한 숫자의 모든 비트가 다른 숫자의 모든 비트와 결합됩니다. 따라서 비트 연산자 OR 및 AND를 이해하려면 숫자를 이진수로 변환 한 다음 일치하는 모든 비트 쌍에 대해 OR 또는 AND 연산을 수행해야합니다.
그 이유는 다음과 같습니다.
00011011 (odd number)
AND
00000001 (& 1)
==
00000001 (results in 1)
이므로
00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)
따라서 (& 1) 연산은 AND 논리를 사용하여 맨 오른쪽 비트를 1과 비교합니다. 다른 모든 비트는 효과적으로 무시됩니다. 이진수의 짝수는 십진 표기법의 짝수이기도합니다 (10은 2의 배수).
바이너리 시스템에 대한 다른 기본 연산에는 NOT 및 XOR이 포함됩니다. NOT은 'A가 꺼져있는 경우'를 의미하며 두 개가 아닌 하나의 신호 또는 '파라미터'만 사용하는 유일한 형태의 논리 게이트입니다. XOR은 'A 또는 B가 켜져 있지만 둘 다가 아닌 경우'를 의미합니다. 그리고 NAND, NOR 및 NXOR이 있으며 기본적으로 AND, OR 및 XOR과 결합되지 않습니다. 즉, NAND는 'A와 B가 모두 켜져 있지 않은 경우'를 의미 합니다.
프로그래밍에서 운영자는
& means AND,
| means OR,
~ means NOT, and
^ means XOR.
나머지는 다음과 같이 결합하여 구성 할 수 있습니다.
~ (a & b) is equivalent to a NAND operation
PHP 관련 참고 사항
비트 연산자는 부동 소수점 값에서 작동하지 않으며 PHP에서는 부동 소수점 값이 암시 적으로 먼저 정수로 변환됩니다. 정수로 표현할 수있는 범위 밖의 숫자는 0으로 잘립니다. 즉, PHP_INT_MAX 이상의 모든 숫자는 표현식에서 "짝수"로 보입니다 ($num & 1)
. PHP_INT_MIN / PHP_INT_MAX 이외의 숫자를 지원하려면 fmod($num, 2)
. 그러나 64 비트 PHP를 사용하는 경우 정수가 부동 소수점보다 정밀도가 더 높습니다.
이것은 또한 비트와 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
다른 답변 외에도 주목할 가치가 있습니다.
if(func1() && func2())
true ( "지연 평가")를 반환하는 func2()
경우 에만 호출 func1()
하지만
if(func1() & func2())
Will call both functions regardless, but the truth tables for both will be the same (assuming they return booleans).
thomasrutter points out (in the comments below) that you probably shouldn't do the latter in practice. (A & B)
won't necessarily have the same truthiness as (A && B)
, particularly when A
and B
are integers. e.g., if A=1 and B=2 (both truthy), A & B will be falsey, whereas A && B is truthy. Also, another developer may think this is a typo and 'correct' it to two ampersands.
I know your question is about understanding the bitwise operator and the accepted answer explains it well. But for the example you give, I cannot help but recommending you use the modulo operator instead:
($var % 2) /* instead of */ ($var & 1)
Because it makes the intent clear that you are checking that the number is odd (not divisible by two), and it is more generic, so you can use ($var % 3) the same way and deduce how it works for any N.
참고URL : https://stackoverflow.com/questions/600202/understanding-php-ampersand-bitwise-and-operator
'developer tip' 카테고리의 다른 글
둘 이상의 행 집합이있는 Django 템플릿의 대체 행 색상 지정 (0) | 2020.12.11 |
---|---|
C # : 이벤트 또는 관찰자 인터페이스? (0) | 2020.12.11 |
필드의 "길이"에 대한 MySQL SELECT 문이 1보다 큽니다. (0) | 2020.12.11 |
Python : dict의 변수를 네임 스페이스로로드 (0) | 2020.12.11 |
javascript 및 짝수 / 홀수 클래스 생성을 사용하지 않고 html 테이블에 얼룩말 줄무늬를 만드는 방법은 무엇입니까? (0) | 2020.12.11 |