2011-06-19 4 views
2

コンピュータは(int x、y)x << yがyビットのシフトを意味することをどのように知っていますか?私はシフト部分を意味しません。私はy部分を意味します。コンピュータはxを1だけシフトし、y == 0になるまでyから1を減算しますか?コンピュータがyの値をどのように把握していないのか?ビットを値に変換する

y = 10の場合、バイナリ表現は0b1010です。 コンピュータは単に1010の各ビットを取ってそれを使用することはできません。値は、単に標準の整数の配列として格納されていないので、私は少しのために、これにしようとしている

は、容器はとても<<>>は少し困難である演算子をオーバーロード、値を表していない8よりも大きいサイズ。 しかし、100ビットの数値から0へのカウントダウンはやや非効率的なので、コンピュータにビット配列をより速く理解させる方法を見つけようとしています。

+3

ALUの内部構造によって異なります。いくつかの非常に醜い、理解不能な、複雑なビット・バイディング回路を、何らかの形でアルゴリズムの複雑さを削減しました。 – delnan

+0

これはハードウェアの質問のように聞こえますが、C++の質問 –

答えて

2

あなたは2ビット配列を持っており、シフト演算子を作成しようとしていますか?それを行う最も簡単な方法は、おそらく右のものをyを整数に変換してから、その量だけxのすべてのビットをシフトすることです。そうでなければ、それを1ビットで動作させたい場合は、さらに効率的ではありません。最初のビットを見てみましょう。そのビットが1であれば、2番目のビットを見てください。1なら2回シフトします。にはがあり効率的です。

yが整数に収まることができない...と、これはちょうど私の頭の上からですが、のは intは2ビットのみですが、 y0b1111であると仮定しましょう仮定

。最初の2ビットをとり、それを整数(3)に変換し、その分だけxをシフトします。 yを右に2(intのサイズ)シフトし、それをintに変換します。これは3をもう一度行います。これは合計4回(int max + 1)繰り返さなければなりません。つまり、前に行った3回はを15回シフトしました。これはyです。より大きな数の場合でもこのプロセスを繰り返すことができます。

+0

は問題ではありません。 yが128ビットの値であればどうなるでしょうか?私はそれが少しばかげていることを知っているが、私のコンテナはそれを処理することができます。その128ビットは値に変換できません(いずれにせよ、私のuint128_tライブラリを使わずに) – calccrypto

+1

@calccrypto:updateを見てください。 bdonlanが話しているこの「バレルシフト」を利用するために、このようなチャンクで操作を繰り返すのが最も速いと思います。 – mpen

10

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

正確な実装は、お使いのハードウェアによって異なります。一部のエンベデッド・プロセッサは実際には単一ビット・シフトのループを実行します。しかし、x86などのより強力なCPUアーキテクチャでは、通常はハードウェア内でbarrel shifterのようなものを使用して、1回の操作で任意のシフトを実行するマシン命令があります。シフト・オペランドの値に対するC制限は、範囲外のシフト値を異なる方法で処理する異なる命令セットに由来します。 x86はshift引数を切り捨てます(つまり、32ビット値を使用している場合は32を法とします)が、他の命令セットのアーキテクチャによっては動作が異なる場合があります。

一般に、組み込みプロセッサ用に開発している場合を除き、1回のビットシフトが高価であることを心配する必要はありません。

関連する問題