いつ 4<<2 を実行したか知りたいのですが、その下で正確に何が起こるのでしょうか?? 乗算が実行されているか、または値がどのように計算されているか。シフト演算子の実装に関するリファレンスがある場合は、返信してください。前もって感謝します
5 に答える
通常、これはプロセッサ命令です(プロセッサ上で直接実行されます)。
それは単にメモリ内のビットをシフトします:
int a = 3; // a = 0 0 1 1
a << 1; // a = 0 1 1 0 = 6
a << 1; // a = 1 1 0 0 = 12
プロセッサが非常に低いレベルでどのように機能するかについての洞察を探しているなら、 CharlesPetzoldによるCodeは読むのに素晴らしい本です。
特定のケースでは、コンパイラはそれを定数にショートカットしますが、一般にプロセッサの命令セットには、ビットシフト操作を実行するための特別なオペコード (操作コード、コマンド) が含まれています。
これがどのように機能するかについての良い説明があります。
ハードウェア用語では、各出力ビットは、入力ビットの 1 つを選択することによって生成されます。乗算器は不要で、多数の多重化が必要です。
一部のプロセッサには、一定の時間内に任意の量をビットシフトできる命令があり、一部のプロセッサには、可変量をシフトできるが、それを行うのに可変の時間がかかる命令があることに注意する価値があります (したがって、何かを 31 ビット左にシフトすると、時間がかかります)、その他は一度に 1 ビットずつシフトする命令に限定されます。通常、このような面倒な実装の詳細について心配する必要はありませんが、共通の結果を達成するさまざまな方法の間には、大きなパフォーマンスの違いが生じる可能性があります。
たとえば、(1<
if (シフト量 & 16) longvar >>= 16; if (シフト量 & 8) longvar >>= 8; if (シフト量 & 4) longvar >>= 4; /* プロセッサーにこれに対する最適化がある場合 */ longvar >>= (シフト量 & 3);
高速シフト用の命令が存在する場合は完全に逆効果ですが、一部の 8 ビット マシンでは大幅な速度向上 (6 倍以上) になる可能性があります。
すべてのプロセッサにはおそらくシフト命令があります。アセンブリ言語で対応する例をいくつか示します。