2009-03-01 4 views
47

코드에서 ($var & 1)을 자주 사용합니다. $var이 홀수 인 경우 true를 반환하고 짝수 인 경우 false를 반환합니다.PHP & (앰퍼샌드, 비트와 앤) 연산자 이해

하지만 실제로 "&"은 무엇을합니까?

+0

일부 질문에 대해서는 간단하지 않으며, 그는 그가 수락 한 대답으로 볼 수 있듯이 운영자에 대한 자세한 설명을 요구하고 있습니다. –

+0

@Olafur - & 연산자는 매우 간단합니다. 그는 정확한 설명을 원하지 않는다. 정확히 설명하지 않고 그것을 사용하고 있기 때문에 그는 설명을 원한다. 그가 그것을 알지 못하고 그것을 배우고 자하는 바람을 존경하지만, 여전히 Google의 질문이 더 많습니다. –

+0

답변이 간단하지는 않지만 게시하는 것은 단순히 다른 곳에서 복사하는 것을 의미합니다. 이것은 중복됩니다. 어떤 사람들은 여가 시간을 없애기 위해 실제로 SO를 사용하고 있다는 느낌이 들었다. 어쩌면 나는 약간 편향되어 있지만 퍼즐과 채팅 같은 질문을 좋아하지 않습니다. – Caffeine

답변

52

&은 이진수가 and입니다. 이진 값이 있고 다른 이진 값을 가진 and 인 경우 결과는 비트 중 and이됩니다. 예 :

01101010 
& 01011001 
= 01001000 

가장 오른쪽 비트는 어느 1 (그 경우의 수가 홀수 인) 또는이 짝수 인 경우에는 0이다. &의 숫자가 1이면 가장 중요한 비트만 보게되고 if는 숫자가 1인지 아니면 0인지를 검사합니다. 다른 사람들이 언급했듯이 비트 연산자는 어떻게 작동하는지에 대한 정보를 찾습니다.

18

이 비트와 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 
+1

이 답변은 실제로 &&가 내 의견으로는 & & 다른 점을 설명하지 못합니다. && 두 매개 변수를 부울 값으로 변환하고 단일 비트를 비교하는 것과 같습니다. & 비트 방식으로 비교 : 한 매개 변수의 각 비트는 다른 비트의 각 비트와 비교됩니다. – thomasrutter

+3

"regular"는 논리 및/또는 –

+1

으로 알려져 있습니다. 비트 연산자 (예 : &와 |)를 알고 있어야합니다. 정수에서 작동합니다. 이 답변의 예제는 'true'가 '1'로 변환되고 'false'가 '0'으로 변환되기 때문에 작동합니다. 'echo ("cheese"& 4)가 있다면, echo ("cheese"&& 4)가 true를 출력하는 반면, 그것은 0을 출력합니다. – thomasrutter

24

두 작업은 OR 및 AND.

OR은 'A가 켜져 있거나 B가 켜져있는 경우'를 의미합니다. 현실 세계의 예가 병렬로 연결된 두 개의 스위치 일 것입니다. 둘 중 하나가 전류 통과를 허용하면 전류가 통과합니다.

AND는 'A와 B가 모두 켜져있는 경우'를 의미합니다. 현실 세계의 예가 두 개의 스위치입니다. 전류는 모두 통과 할 때만 통과합니다.

컴퓨터에서 이러한 스위치는 물리적 스위치가 아니라 반도체이며 해당 기능은 logic gates입니다. 그들은 스위치와 같은 종류의 일을합니다 - 현재 또는 전혀 전류에 반응하십시오.

정수에 적용하면 한 숫자의 모든 비트가 다른 숫자의 모든 비트와 결합됩니다. 따라서 비트 연산자 OR 및 AND를 이해하려면 숫자를 2 진수로 변환 한 다음 일치하는 비트 쌍마다 OR 또는 AND 연산을 수행해야합니다. 제 (& 1) 조작에 따라서 1 가장 오른쪽 비트를 비교

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

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

반면 사용 AND 논리 : 왜

. 아무것도 아무것도 없기 때문에 다른 모든 비트는 효과적으로 무시됩니다. 2 진수의 짝수는 10 진수 표기법의 짝수입니다 (10은 2의 배수 임).

이진 시스템에 대한 다른 기본 작동에는 NOT과 XOR이 포함됩니다. NOT은 'A가 꺼져 있으면'을 의미하며, 하나의 신호 또는 '매개 변수'대신 2 개의 논리 게이트를 사용하는 유일한 형태입니다. XOR은 'A 또는 B가 켜져 있지만 둘 다 아닌 경우'를 의미합니다. 그리고 AND, OR, XOR과 기본적으로 결합되지 않은 NAND, NOR 및 NXOR가 있습니다. 즉, 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를 사용하는 경우 정수는 부동 소수점보다 더 큰 정밀도를 갖습니다.

+2

개인적으로 나는이 문제를 수용된 대답보다 더 잘 설명한다고 생각합니다. 실제로 비트 연산이 장면 뒤에서 무엇을하는지 설명하기 때문에 이해하고 사용하는 것이 중요합니다. – Byson

11

당신의 질문은 비트 연산자를 이해하는 것이고 받아 들인 대답은 그것을 잘 설명합니다. 그러나 당신이주는 예를 들어, 내가 도울 수 없지만 대신 나머지 연산자를 사용 추천 : 당신이 수 (두 가지로 나누어되지 않음) 이상한 것을 확인하고 있다는 의도를 명확하게하기 때문에

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

을하고, 더 일반적인, 그래서 당신은 ($ var에 % 3) 같은 방법으로 사용하고 다른 답변 이외에 어떤 N.

11

작동하는 방법을 추론 할 수 있습니다, 그것은 주목할 가치가 있다는

if(func1() && func2()) 

에만 의지 func1()이 true를 반환하면 func2()으로 전화하십시오 ("la ZY 평가 "), 가정 (

if(func1() & func2()) 

에 관계없이 모두 함수를 호출하지만 모두 진실 테이블이 동일합니다 반면, 그들은 논리 값을 반환).


thomasrutter는 실제로 후자를하지 말아야한다고 (아래 의견에서) 지적합니다. (A & B)은 반드시 과 동일한 진실성을 가질 필요가 없습니다. 특히 AB이 정수인 경우에는 마찬가지입니다. 예를 들어, A = 1 및 B = 2 (진실) 인 경우, A &B는 거짓이고 반면에 A & &B는 진실이다. 또한 다른 개발자는 이것이 오타라고 생각할 수 있으며 두 개의 앰퍼샌드로 '수정'할 수 있습니다.

+1

+1, 이것은 매우 흥미로 우며 누구에게도 알려지지 않았습니다. – dgraziotin

+0

중요한 차이. –

+1

대부분의 경우 * 작동하지만 숫자가 반환 될 때와 같이 항상 작동하지는 않습니다. func1()이 1을 반환하고 func2()가 4를 반환한다고 가정 해 봅시다.'func1() & func2()'는'true'로 평가되는 반면'func1() & func2()'는'true'로 평가됩니다. 심지어 작동하는 경우에도 평가 순서 및 형식 변환의 부작용에 의존하므로 코드 작성 목적을 읽고 이해하기가 더 어려워 지므로 좋은 코딩 방법이라고하지는 않습니다. 코드를 검토하는 모든 사람은 오타라고 추정 할 수 있습니다. – thomasrutter