多くの場合、実際に試してみればすぐに分かることですが,2nによる割り算と右シフトは、常に等価になるとは限りません。しかし、この問題は規格上処理系定義の要素が複雑に絡み合っているため、注意深く考えないと全体像をとらえることができません。
まずは簡単なところから手を付けることにしましょう。被除数が正の場合です(符号無し整数の場合もこれに含まれます)。正整数 / 2nの計算は,正整数 >> n に単純に置き換えることができます。端数は常に切り捨てられるため、これは簡単です。
次に、被除数が負の場合を考えます。ここで、符号付き整数の右シフトが算術シフトにならないような処理系は論外ですので議論の対象から外します。議論の対象から外すとはいえ、そういうケースがある時点で2nによる割り算と右シフトが常に等価ではないことが分かります。なお、負整数の内部表現が符号と絶対値の場合の算術シフトは、符号ビットの状態を保持したまま、値ビットだけをシフトするものと考えます。
-1を2で割った場合、C99以降またはC++11以降では0になります。しかし、負整数の内部表現が2の補数の場合には、-1を算術右シフトすると-1になります。1の補数および符号と絶対値の場合は-0になります。ただし、これが+0に置き換わるかどうかは処理系に依存しますし、-0に相当するビットパターンがトラップ表現になる場合もあり得ます。いずれにせよ、2で割った場合と1ビット算術右シフトした場合は常に等価ではありません。
そして、C99より前のC言語やC++11より前のC++では、-1 / 2が0になるか-1になるかは処理系定義ですので、それによっても状況が変わってきます。

![[迷信] アルゴリズム関数内で関数オブジェクトはコピーされない](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4845189_s.jpg)
![[迷信] FILE型は構造体](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4285286_s.jpg)
![[迷信] コンパイルエラーが出るのでアクセス指定子を修正](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4409283_s.jpg)
![[迷信] setjmpマクロの返却値は変数に代入できる](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4225767_s.jpg)
![[迷信] オブジェクトの動的生成に失敗するとメモリリークする](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4673249_s.jpg)
![[迷信] ソースコード中の即値を全廃せよ](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4167072_s.jpg)