测试数字是奇数还是偶数

use*_*585 250 php variables numbers

什么是最简单的最基本的方法来确定数字/变量是奇数还是甚至在PHP中?这与mod有关吗?

我已经尝试了一些脚本,但是谷歌目前还没有提供.

Tim*_*per 547

你是正确的认为mod是一个很好的起点.这是一个表达式,如果$number是偶数则返回true,如果是奇数则返回false:

$number % 2 == 0
Run Code Online (Sandbox Code Playgroud)

适用于每个整数PHP值,请参阅算术运算符PHP.

例:

$number = 20;
if ($number % 2 == 0) {
  print "It's even";
}
Run Code Online (Sandbox Code Playgroud)

输出:

它甚至是

  • 如果你在循环或大量使用它,你可能想要考虑Arius2038建议的bitcheck,这是非常快的.对于奇数/偶数检查,bitcheck是我首选的方法. (10认同)
  • 我是否可以建议使用三重 `=` 来提高分数速度:`$number % 2 === 0` (2认同)

Paw*_*iel 189

另一种选择是简单的位检查.

n & 1
Run Code Online (Sandbox Code Playgroud)

例如:

if ( $num & 1 ) {
  //odd
} else {
  //even
}
Run Code Online (Sandbox Code Playgroud)

  • 上面的链接已经死了.这是另一个很好的解释:http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/ (4认同)

Aar*_* W. 23

是的使用mod

$even = ($num % 2 == 0);
$odd = ($num % 2 != 0);
Run Code Online (Sandbox Code Playgroud)


Tar*_*rik 8

虽然所有答案都是正确的,但一行中的简单解决方案是:

$check = 9;
Run Code Online (Sandbox Code Playgroud)

之一:

echo ($check & 1 ? 'Odd' : 'Even');
Run Code Online (Sandbox Code Playgroud)

要么:

echo ($check % 2 ? 'Odd' : 'Even');
Run Code Online (Sandbox Code Playgroud)

效果很好.


小智 7

(bool)($number & 1)
Run Code Online (Sandbox Code Playgroud)

要么

(bool)(~ $number & 1)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个按位运算符我相信,除非你知道你正在做什么与这种幻想,我会避免这种语法. (3认同)

Sub*_*bin 7

另一种选择是检查最后一位数字是否为偶数:

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

或者为了加快速度,请使用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
}
Run Code Online (Sandbox Code Playgroud)

或者让它更快(有时节拍mod operator):

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

这是时间测试,作为我的发现的证明.

  • 与其他方法相比,它非常昂贵. (4认同)
  • @grantwparks我已经更新了代码以包含`in_array`,它有时会击败mod运算符. (2认同)

Rub*_*len 5

我做了一些测试,发现在mod is_int&-operator之间,mod是最快的,紧跟着&-operator. is_int比mod慢近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>";
Run Code Online (Sandbox Code Playgroud)

我得到的结果非常一致.这是一个示例:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator
Run Code Online (Sandbox Code Playgroud)

  • 在我的服务器上(5.4.4/cli /没有opcache/i7)"&"比mod快10%(在带有随机整数值的数组上测试) (2认同)

Loe*_*man 5

PHP 正在将 null 和空字符串自动转换为零。模数也会发生这种情况。因此将代码

$number % 2 == 0 or !($number & 1)
Run Code Online (Sandbox Code Playgroud)

值 $number = '' 或 $number = null 结果为真。我对其进行了测试,因此扩展了一些:

function testEven($pArg){
    if(is_int($pArg) === true){
        $p = ($pArg % 2);
        if($p === 0){
            print "The input '".$pArg."' is even.<br>";
        }else{
            print "The input '".$pArg."' is odd.<br>";
        }
    }else{
        print "The input '".$pArg."' is not a number.<br>";
    }
}

The print is there for testing purposes, hence in practice it becomes:
function testEven($pArg){
    if(is_int($pArg)=== true){
        return $pArg%2;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

此函数对于任何奇数返回 1,对于任何偶数返回 0,当它不是数字时返回 false。我总是写 === true 或 === false 来让我自己(和其他程序员)知道测试是按预期进行的。