2017-04-16 9 views
2

숫자를 취하여 해당 일에 해당하는 배열을 반환하는 함수가 있습니다 (이 숫자는 요일별로 비트 마스크 처리됩니다). 그러나 배열은 특정 값에 대해 모든 요일을 반환하고 다른 값에 대해서는 빈 배열을 반환합니다. 아래는 아래 에코 나는 문제 뒤에 이유를 알 수없는 것PHP 비트 연산이 올바른 값을 반환하지 않음

days: 10101 - type: integer 
type1: integer - type2: integer 
days & 0x01 = 1 = 1 
days & 0x02 = 0 = 1 
days & 0x04 = 4 = 1 
days & 0x08 = 0 = 1 
days & 0x10 = 10 = 1 
days: 1010 - type: integer 
type1: integer - type2: integer 
days & 0x01 = 0 = 0 
days & 0x02 = 2 = 0 
days & 0x04 = 0 = 0 
days & 0x08 = 8 = 0 
days & 0x10 = 0 = 0 

의 결과가 기능

function get_days($days) { 
    $days_arr = array(); 


echo "days: " . decbin($days) . " - type: " . gettype($days) . "<br/>"; 
echo "type1: " . gettype($days & 0x01) . " - type2: " . gettype(0x01) . "<br/>"; 
echo "days & 0x01 = " . dechex($days & 0x01) . " = " . ($days & 0x01 == 0x01) . "<br/>"; 
echo "days & 0x02 = " . dechex($days & 0x02) . " = " . ($days & 0x02 == 0x02) . "<br/>"; 
echo "days & 0x04 = " . dechex($days & 0x04) . " = " . ($days & 0x04 == 0x04) . "<br/>"; 
echo "days & 0x08 = " . dechex($days & 0x08) . " = " . ($days & 0x08 == 0x08) . "<br/>"; 
echo "days & 0x10 = " . dechex($days & 0x10) . " = " . ($days & 0x10 == 0x10) . "<br/>"; 


    if($days & 0x01 == 0x01) 
     $days_arr[] = 'M'; 

    if($days & 0x02 == 0x02) 
     $days_arr[] = 'T'; 

    if($days & 0x04 == 0x04) 
     $days_arr[] = 'W'; 

    if($days & 0x08 == 0x08) 
     $days_arr[] = 'H'; 

    if($days & 0x10 == 0x10) 
     $days_arr[] = 'F'; 

    return $days_arr; 
} 

, 그것이 작동한다는 것을 나에게 논리적 인 것 같다.

+2

이 제품은 연산자 우선 순위 문제입니다. 비교가 더 높은 우선 순위를 가지므로 비트 연산이 발생하기 전에 비트식이 괄호로 묶여 져야합니다. if 문에서 원하는 결과를 제공하는 구문은'if (($ days & 0x08) == 0x08)'입니다. http://php.net/manual/en/language.operators.precedence.php 및 http://php.net/manual/en/language.operators.bitwise.php를 참조하십시오. – drew010

답변