2014-04-24 3 views
0

누군가가 어떻게 작동하는지 설명 할 수 있습니까? 고마워요 :)PHP 함수 플래그를 매개 변수로 사용

define("FLAG_A", 1); 
    define("FLAG_B", 2); 
    define("FLAG_C", 4); 
    function test_flags($flags=false) { 
     if ($flags & FLAG_A) echo "A"; 
     if ($flags & FLAG_B) echo "B"; 
     if ($flags & FLAG_C) echo "C"; 
    } 
    test_flags(FLAG_A|FLAG_B); 
+1

저는 비트 워킹 운영자가 무엇인지, 각각 어떻게 작동하는지 독자적으로 조사해야한다고 생각합니다. –

+1

오, 정말 고마워, 정말로 내가 무슨 구글을 위해 단서를 가지고 있지 않았다 :) – Adrian

+0

내가 그것을 찾은 후에, 너는 무엇을 알고있다, 그것은 거의 즉시 감각을 가지고 있었다. :)) thanks! – Adrian

답변

3

이것은 bitwise math을 사용하여 수행됩니다. 특히 그들은 & (비트 및) 연산을 사용하여 값이 설정되어 있는지 확인합니다. 여기서 논의하기 위해 우리는 4 비트 숫자를 사용하여 짧고 단순하게 유지합니다.

다음 숫자 7은, 4 비트 바이너리이다 :

0111 

각 숫자마다 두 배가되는 값을 갖고, 그들 모두가 7의 총 개수를 만들기 위해 함께 가산된다 . 세분화, 그것과 같이 작동합니다

0 1 1 1 
^ ^^^
| | | | 
8 4 2 1 

그래서, 본질적으로, 그것이 :

0 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 7 

이제, 비트와 함께 현명한 수학, 특히 bitwise 그리고 우리는 특정 열의 비트에 대해서만 신경을 쓸 수 있습니다 - 기본적으로 각 열의 비트는 1이어야합니다. 그렇지 않으면 0으로 설정됩니다. 그래서, '4'내부 검사 '7'비트 수학으로 :

0111 (7) 
& 0100 (4) 
______ 
    0100 (4) 

을이 값이 0이기 때문에, 사실, 우리는 값 4 지금 고려 값 (7) 내부에 있음을 확인할 수 있습니다 수 11 :은 0의 값을 가지고 있기 때문에

1 0 1 1 
^ ^^^
| | | | 
8 4 2 1 

1 * 8 + 0 * 4 + 1 * 2 + 1 * 1 = 11 

1011 (11) 
& 0100 (4) 
______ 
    0000 (0) 

4 찾아보십시오, 그것은 거짓이며, 우리는 수 (4)가 내부 아니라는 것을 고려할 수 넘버 11.

마찬가지로 숫자 4, 2 및 1은 8이지만 7은 8이라는 결론을 내릴 수 있습니다. 11에서는 8, 2 및 1이 있습니다. 숫자를 단항 하나의 정수 안에 많은 플래그를 저장할 수 있습니다.

정확하게 비트 연산에 대해 더 자세히 읽으십시오. 정확하게 사용하면 매우 유용 할 수 있습니다. 모든 것을 구두로하려고하지 마십시오.

+0

자세한 응답을 존중하십시오! 고마워요! 나는이 모든 것의 배후에 바이너리 수학이라는 단서를 가지고 있지 않았다. 도대체 나는 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 하나도 알지 못했다. 바이너리 수학에 익숙하지만, 당신을 재빨리 기분 전환시키는 것이 좋았다! 고마워요! – Adrian

1

이것은 비트 연산자를 기반으로합니다. 따라서, 예를 들면, $flags & FLAG_A는 비트이고 $flags 변수와 상수를 FLAG_A 사이

define("FLAG_A", 0001); // in binary form 
define("FLAG_B", 0010); 
define("FLAG_C", 0100); 

생각.

+0

조금 도와 줬습니다. – Adrian

관련 문제