スタイルがズレているのはスキンのリファクタリング中だからです。

整数の偶奇判定

algorithmAlgorithm
この記事は約2分で読めます。
スポンサーリンク
奇数2で除算すると剰余1になる数
偶数2で除算すると剰余0になる数

2の除算による判定

最も簡単な判定法です。
2で割ってあまりが出るか否かで判定します。

if (value % 2 == 1)
{
    return "奇数です";
}
else
{
    return "偶数です";
}

ただ、この方法は速度が遅いです。

ほとんどの人間が除法が苦手であることと同じで、コンピューターは除法が苦手です(計算に時間がかかる)。

10の除算による判定

先ほどの「2の除算」の応用です。

2の倍数は、必ず下1桁が偶数です。
この法則を利用します。

// 一の位を取得する
var num = value % 10;

switch (value)
{
  case 0:
  case 2:
  case 4:
  case 6:
  case 8:
    return "偶数です";
  default:
    return "奇数です";
}

下1桁が「2の倍数」であるか判定することで、偶奇性判定を行います。

除法を使うため、速度は遅いです。
また、行数も長くなります。

論理積ANDによる判定

0
1
10
11
100
101
110
111
1000
1001

整数を2進数で表現すると、次の法則があります。

  • 奇数は下1桁が「1」
  • 偶数は下1桁が「0」

また、論理積ANDは、お互いのビットが「1」である場合のみ「1」を返します。

この法則を利用して「1との論理積ANDを求める」方法です。

if (value & 1 == 1)
{
    "奇数です";
}
else
}
    "偶数です";
{

1は下1桁のみ1で、それ以外はすべて0です。
これの論理積ANDを求めると、すべての整数で下1桁以外は0を返します。
残りの下1桁との論理積ANDで「0」か「1」かが決まり、それにより偶奇判定が行えます。

コンピューターはビット関連の演算は乗法除法より得意です。
各ビットの論理演算のため、除法に比べて高速です。

コメント

タイトルとURLをコピーしました