2

x << yコンピューターは、(int x、y)がyビットのシフトを意味することをどのように認識しますか?シフト部分という意味ではありません。私はそのy部分を意味します。コンピューターはxを1シフトし、y == 0になるまでyから1を引きますか?そうでない場合、コンピュータはどのようにしてyの値を計算しますか?

と言うとy = 10、バイナリ表現は0b1010です。コンピューターは、単純に各ビットを取得1010して使用することはできませんね。

8より大きいビットサイズでこれを実行しようとしています。値は単純に標準整数の配列として格納されないため、コンテナーは値を表さないため、演算子のオーバーロード<<が発生>>し、少し難しくなります。ただし、100ビット数から0にカウントダウンするのはやや非効率的であるため、コンピューターがビット配列をより速く理解できるようにする方法を見つけようとしています。

4

2 に答える 2

10

まず、Cでは、問題の型のビット幅よりも大きいシフトを実行する効果は定義されていません。つまり、32ビットintの場合x << 33、信頼性の低い結果になります(ゼロである必要はありません!)。

正確な実装はハードウェアによって異なります。一部の組み込みプロセッサは、実際にシングルビットシフトのループを実行します。ただし、x86などのより強力なCPUアーキテクチャでは、通常はハードウェアのバレルシフタのようなものを使用して、1回の操作で任意のシフトを実行するマシン命令があります。シフトオペランドの値に対するCの制限は、範囲外のシフト値を異なる方法で処理する異なる命令セットに起因します。x86はシフト引数を切り捨てます(つまり、32ビット値を使用している場合はモジュロ32を実行します)が、他の一部の命令セットアーキテクチャでは動作が異なる場合があります。

一般に、組み込みプロセッサ用に開発しているのでない限り、シングルビットシフトが高価であることを心配する必要はありません。

于 2011-06-19T01:00:09.057 に答える
2

2ビット配列があり、それらのシフト演算子を作成しようとしていると言っていますか?これを行う最も簡単な方法は、おそらく正しいものをy整数に変換してから、すべてのビットをxその量だけシフトインすることです。さらに効率が悪い。最初のビットを見て、その1が1回シフトし、2番目のビットを見て、その1が2回シフトしている場合、効率を上げるには全体として対処する必要があると思います。


整数に収まらないと仮定しyます...そしてこれは私の頭のすぐ上にありますが、anintが2ビットだけでyあると仮定しましょう0b1111。次に、最初の2ビットを取得し、それを整数(3)に変換して、xその量だけシフトします。次に、2(intのサイズ)だけ右シフトyし、それをintに変換します。これにより、3が再び作成されます。これを4回(int max + 1)繰り返して合計12にする必要があります。つまり、前に行った3xは、の値である15回シフトしたことを意味しますy。このプロセスをさらに大きな数で繰り返すことができます。

于 2011-06-19T00:51:08.480 に答える