C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のビット演算子を使って数値が正・負・ゼロのどれかを判定する方法

この記事では、ビット演算子のみを使って、ある数値が正の数負の数ゼロのいずれであるかを判定する方法を解説します。if文などの条件分岐に頼らずに判定できるのがポイントです。

判定の仕組み

32ビット整数を前提とすると、算術右シフトでは符号ビットが伝播するという性質を利用します。

  • n >> 31 を実行すると、負の数は -1 に、それ以外の数は 0 になります。
  • -n >> 31 を実行すると、正の数は -1 になります(負号を反転しているため)。
  • n が 0 の場合は、n >> 31-n >> 31 のどちらも 0 を返します。

これらの性質を組み合わせると、次の式で数値の種類を一意に判別できます。

1 + (n >> 31) - (-n >> 31)

この式の結果は以下のようになります。

  • n が負の数の場合: 1 + (-1) − 0 = 0
  • n が正の数の場合: 1 + 0 − (-1) = 2
  • n がゼロの場合: 1 + 0 − 0 = 1

つまり、戻り値が「0なら負」「1ならゼロ」「2なら正」と対応しています。

サンプルコード

#include <iostream>
#include <cmath>
using namespace std;

int checkNumber(int n){
    return 1 + (n >> 31) - (-n >> 31);
}

int printNumberType(int n){
    int res = checkNumber(n);
    if(res == 0)
        cout << n << " is negative" << endl;
    else if(res == 1)
        cout << n << " is Zero" << endl;
    else if(res == 2)
        cout << n << " is Positive" << endl;
}

int main() {
    printNumberType(50);
    printNumberType(-10);
    printNumberType(70);
    printNumberType(0);
}

実行結果

50 is Positive
-10 is negative
70 is Positive
0 is Zero

注意点

この手法は32ビットの整数型(int)を前提としており、右シフトが算術シフトとして動作する処理系(一般的なコンパイラ環境)でのみ正しく機能します。また、C++の規格上、右シフトの動作は実装定義であるため、移植性を重視するコードでは通常の比較演算子を使う方が安全です。あくまでビット演算の挙動を理解するためのテクニックとして活用しましょう。

  1. 【Python入門】数値が正・負・ゼロのどれかを判定するプログラムの書き方

    Pythonでは、ある数値が正の数、負の数、それともゼロなのかを判定したい場面がよくあります。こうした処理は、シンプルな「if」条件文を使うだけで簡単に実装できます。以下に具体的なサンプルコードとその実行結果を示します。サンプルコード= 0: if my_num == 0: print(The number is equal to zero) else: print(It is a positive number) else: print(It is a negative number)実行結果It is a positive numbe

  2. 【Python入門】数値が正・負・ゼロ、偶数・奇数のどれかを判定するプログラム

    プログラミングの基礎学習において、与えられた数値が偶数か奇数、そして正か負(またはゼロ)かを判定する処理は、条件分岐の考え方を理解するうえで非常に重要な題材です。本記事では、Pythonを使ってこれらの判定を一度に行うプログラムを、アルゴリズムとサンプルコード付きでわかりやすく解説します。 アルゴリズム 判定の手順は以下の通りです。 ステップ1:数値を入力する ステップ2:数値が0以上かどうかを判定する。真であれば「正の数」、偽であれば「負の数」。数値がちょうど0の場合は「ゼロ」とする。 ステップ3:数値が2で割り切れる場合は「偶数」、割り切れない場合は「奇数」と判定する。 サンプルコード 以