문제

나는 종종 사용한다 ($var & 1) 내 코드에서는 IF가 반환됩니다 $var 짝수 인 경우 홀수이고 거짓입니다.

그러나 "&"는 실제로 무엇을합니까?

도움이 되었습니까?

해결책

& 이진입니다 and. 이진 값이있는 경우 and 다른 이진 값을 사용하면 결과가 비트가됩니다. and 둘 중. An example:

  01101010
& 01011001
= 01001000

가장 오른쪽 비트는 1 (그리고이 경우 숫자는 홀수)이거나 0이므로 숫자는 짝수입니다. 만약 너라면 & 1 인 숫자는 최소한 유의미한 비트 만 살펴보고, 숫자가 1 또는 A 0인지 확인합니다. 다른 사람들이 언급했듯이, 비트 연산자가 작동 방식에 대한 정보를 확인하십시오.

다른 팁

이진 시스템의 기본 인 두 가지 작업은 또는 및입니다.

또는 'A가 켜져 있거나 B가 켜져있는 경우'를 의미합니다. 실제 예제는 두 개의 스위치와 병렬로됩니다. 어느 쪽이든 전류를 통해 허용하는 경우, 전류는 통과합니다.

그리고 'A와 B가 모두 켜져 있다면'를 의미합니다. 실제 예제는 시리즈의 두 스위치입니다. 둘 다 전류를 허용하는 경우에만 전류가 통과됩니다.

컴퓨터에서는 물리적 스위치가 아니라 반도체이며 기능이 호출됩니다. 논리 게이트. 그들은 스위치와 같은 종류의 일을합니다 - 전류에 반응하거나 전류가 없다.

정수에 적용되면 한 숫자의 모든 비트는 다른 숫자의 모든 비트와 결합됩니다. 따라서 Bitwise 연산자 또는 및 및 숫자를 이진으로 변환 한 다음 모든 일치하는 비트 쌍에서 OR 및 OR 및 작동을 수행해야합니다.

그것이 이유입니다 :

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

반면

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

따라서 (& 1) 작업은 오른쪽 비트를 사용 및 논리와 1로 비교합니다. 다른 모든 비트는 효과적으로 무시됩니다. 왜냐하면 아무것도 없기 때문입니다. 이진의 짝수 숫자는 또한 소수점 표기법의 짝수 숫자입니다 (10은 2의 배수).

이진 시스템에 대한 다른 기본 작업에는 NOT 및 XOR이 포함됩니다. 'A가 꺼져있는 경우'를 의미하지 않으며 두 가지 대신 하나의 신호 또는 '매개 변수'만 취하는 유일한 형태의 논리 게이트입니다. XOR은 'A 또는 B 중 하나가 켜져 있지만 둘 다가 아니라는 것을 의미합니다. 그리고 기본적으로 결합되지 않은 NAND, NO, 및 NXOR이 있습니다. ~ 아니다 둘 다 '.

프로그래밍에서 운영자

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

다른 것들은 예를 들어 이것들을 결합하여 구성 할 수 있습니다.

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

PHP 특정 참고

Bitwise 연산자는 부동 소수점 값에서 작동하지 않으며 PHP에서 플로트 값은 먼저 정수로 암시 적으로 변환됩니다. 정수로 표현할 수있는 범위 외부의 숫자는 0으로 잘릴 것입니다. 즉, php_int_max의 모든 숫자는 표현식에서 "심지어"보입니다. ($num & 1)). php_int_min/php_int_max 이외의 숫자를 지원하려면 필요합니다. fmod($num, 2). 그러나 64 비트 PHP에 있다면 정수는 어쨌든 플로트보다 정밀도가 높습니다.

이것은 또한 Bitwise와 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())

전화 만 전화합니다 func2() 만약에 func1() True ( "Lazy Evaluation")를 반환하는 반면

if(func1() & func2())

두 기능을 모두 호출하지만 두 기능을 모두 호출하지만 두 가지 모두에 대한 진실 테이블은 동일합니다 (부울을 반환한다고 가정).


Thomasrutter는 (아래의 의견에서) 실제로 후자를 실제로 수행해서는 안된다고 지적합니다. (A & B) 반드시 반드시 같은 진실성을 가질 필요는 없습니다 (A && B), 특히 언제 A 그리고 B 정수입니다. 예를 들어, a = 1과 b = 2 (진실 모두) 인 경우 A & B는 거짓이며 A && B는 진실입니다. 또한 다른 개발자는 이것이 오타라고 생각하고 두 개의 암페어 샌드에 '수정'이라고 생각할 수 있습니다.

나는 당신의 질문이 비트 연산자를 이해하는 것에 관한 것임을 알고 있으며 받아 들여진 답변은 그것을 잘 설명합니다. 그러나 당신이주는 예를 위해, 나는 당신이 대신 모듈로 연산자를 사용하는 것을 권장 할 수는 없습니다.

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

숫자가 홀수 (2로 나눌 수 없음)인지 확인하고 더 일반적 이어도 같은 방식으로 ($ var % 3) N.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top