質問: このページで説明されているシフト演算について質問なんですが、下の図の理解であってますか? ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/d1fbaf8b48b5765e18a5896fbff82308.png) *図が汚くてわかりにくくてすいません。イラストレータの勉強も必要みたいです。 ### 追記 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/533fbde98d5b22fa6718f04c9a24bee3.png)
回答: どういう風に理解しているかが甚だ疑問ですが(書いた図からすると、微妙に勘違いしているようにみえる)、シフト演算はその名の通り、ビット位置を**ずらす**演算です。 まず左シフトから説明しますか。左シフトはその名の通り、各ビットの値を上位ビット方向に移す演算です。移した結果、空いた最下位ビットには必ず「0」が入ります(質問者さんが書いた図だと、最上位ビットの値をここに移すかのように書いていますが、そんなことはしません。最下位ビットは「0」固定です)。 次に右シフト。こちらは各ビットを下位ビット方向にずらしますが、結果的に空いた最上位ビットには、最上位ビットの扱いによって埋められる値が変わってきます(まあ、早い話が`signed`か`unsigned`かで変わります)。`signed`つまり、符号として扱う場合、符号と同じ値が埋められます。つまり、「0」(=正数)であれば「0」が、「1」(=負数)であれば「1」が埋められます。一方、`unsigned`つまり、符号として扱わない場合は固定で「0」が埋められます(質問者さんが書かれた図だと最下位ビットの値を最上位に移すかのように書かれていますが、決して最下位ビットの値を最上位ビットに移すということはしません)。