[php] 숫자가 홀수인지 짝수인지 테스트

PHP에서 숫자 / 변수가 홀수인지 심지어 짝수인지 확인하는 가장 간단한 방법은 무엇입니까? mod와 관련이 있습니까?

몇 가지 스크립트를 시도했지만 .. Google이 현재 제공하지 않습니다.



답변

당신은 모드가 시작하기에 좋은 장소라고 생각하는데 옳았습니다. $number짝수 이면 true를 반환 하고 홀수이면 false를 반환하는 표현식이 있습니다 .

$number % 2 == 0

모든 정수 PHP 값에 대해 작동합니다 . 산술 연산자 PHP 도 참조하십시오 .

예:

$number = 20;
if ($number % 2 == 0) {
  print "It's even";
}

산출:

심지어


답변

또 다른 옵션은 간단한 비트 검사입니다.

n & 1

예를 들면 다음과 같습니다.

if ( $num & 1 ) {
  //odd
} else {
  //even
}


답변

예 모드를 사용하여

$even = ($num % 2 == 0);
$odd = ($num % 2 != 0);


답변

모든 대답이 정확하고 정확하지만 한 줄에 간단한 해결책은 다음과 같습니다.

$check = 9;

어느 한 쪽:

echo ($check & 1 ? 'Odd' : 'Even');

또는:

echo ($check % 2 ? 'Odd' : 'Even');

잘 작동합니다.


답변

(bool)($number & 1)

또는

(bool)(~ $number & 1)


답변

다른 옵션은 마지막 숫자가 짝수인지 확인하는 것입니다.

$value = "1024";// A Number
$even = array(0, 2, 4, 6, 8);
if(in_array(substr($value, -1),$even)){
  // Even Number
}else{
  // Odd Number
}

또는 더 빠르게하려면 isset()대신 다음을 사용하십시오 array_search.

$value = "1024";// A Number
$even = array(0 => 1, 2 => 1, 4 => 1, 6 => 1, 8 => 1);
if(isset($even[substr($value, -1)]){
  // Even Number
}else{
  // Odd Number
}

또는 더 빨리 만들기 위해 ( 때때로 비트mod operator ) :

$even = array(0, 2, 4, 6, 8);
if(in_array(substr($number, -1),$even)){
  // Even Number
}else{
  // Odd Number
}

여기 내 결과에 대한 증거로 시간 테스트 가 있습니다.


답변

나는 약간의 테스트를했는데 mod is_int&-operator 사이 에서 mod가 가장 빠르며 & 연산자가 밀접 하다는 것을 알았습니다 .
is_intmod보다 거의 4 배 느립니다.

테스트 목적으로 다음 코드를 사용했습니다.

$number = 13;

$before = microtime(true);
for ($i=0; $i<100000; $i++) {
    $test = ($number%2?true:false);
}
$after = microtime(true);

echo $after-$before." seconds mod<br>";

$before = microtime(true);
for ($i=0; $i<100000; $i++) {
    $test = (!is_int($number/2)?true:false);
}
$after = microtime(true);

echo $after-$before." seconds is_int<br>";

$before = microtime(true);
for ($i=0; $i<100000; $i++) {
    $test = ($number&1?true:false);
}
$after = microtime(true);

echo $after-$before." seconds & operator<br>";

내가 얻은 결과는 꽤 일관되었습니다. 샘플은 다음과 같습니다.

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator