programing

PHP & (ampersand, bitwise and) 연산자 이해하기

css3 2023. 8. 8. 21:45

PHP & (ampersand, bitwise and) 연산자 이해하기

자주 사용합니다.($var & 1)내 코드에서, 만약 그렇다면 진실을 반환합니다.$var홀수이고 짝수일 경우 거짓입니다.

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

이진수입니다.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가 꺼져 있는 경우'를 의미하지 않으며 2 대신 하나의 신호 또는 '파라미터'만 수신하는 유일한 형식의 논리 게이트입니다. 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으로 잘립니다.는 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

저는 당신의 질문이 비트 연산자를 이해하는 것에 대한 것이고 수용된 답변이 그것을 잘 설명한다는 것을 알고 있습니다.그러나 당신이 제시한 예에 대해서는 모듈로 연산자를 대신 사용할 것을 권장하지 않을 수 없습니다.

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

이는 숫자가 홀수(2로 나눌 수 없음)이고 더 일반적이기 때문에 ($var % 3)을 동일한 방법으로 사용하고 N에 대해 작동하는 방식을 추론할 수 있습니다.

다른 답변 외에도, 주목할 필요가 있습니다.

if(func1() && func2())

호출만 할 것입니다.func2()한다면func1()를 합니다. 서 true는 다음과 같습니다.

if(func1() & func2())

상관없이 두 함수를 호출하지만 두 함수의 참 표는 동일합니다(불리언이 반환된다고 가정).


Thomasrutter는 (아래 댓글에서) 아마도 후자를 실제로 해서는 안 될 것이라고 지적합니다.(A & B)반드시 와 같은 진실성을 가지고 있지는 않을 것입니다.(A && B) 특히경는에 때.A그리고.B예를 들어, A=1과 B=2(둘 다 참)일 경우 A와 B는 거짓인 반면, A&B는 참입니다.또한, 다른 개발자는 이것이 오타라고 생각하고 두 앰퍼샌드로 '수정'할 수 있습니다.

언급URL : https://stackoverflow.com/questions/600202/understanding-php-ampersand-bitwise-and-operator