- ベストアンサー
ビットシフトってどんな時使うの?
<<を使うビットシフトってありますよね? あれってどういうとき使うんでしょうか・・。 使い方が良く解りません。 10進数の2を8に出来たりするようですけど 2を8にしたり 2を32にしたりする事って便利なんでしょうか? それとももっと他の使い方があるのでしょうか? ビットシフトを利用した便利な使い方、なぜこのような使い方があるのか教えてくださいお願いします!^^
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
掛け算、割り算の代わりに使う事ができます。 ある数を2倍にする時、通常「data*2」としますよね。 これを「data<<1」としても同じ事になります。 同様に data<<2:4倍 data<<3:8倍 data<<4:16倍 逆も出来ます。 data>>1:1/2 data>>2:1/4 data>>3:1/8 こちらの方が普通に掛け算するよりも演算速度が速いそうです。
その他の回答 (6)
- matyrcry
- ベストアンサー率47% (101/213)
確かに単体では使いどころの難しい演算ですね。 乗除算をシフトと加減算の組み合わせで実現したので、CPU自体に そういう命令語を持っています。 もっと高等な(人間の思考回路に近い)命令語もたくさんあるので、 それで足りれば使う必要もないと思いますが、その処理を実現するた めにCPU内部で行われている手順に思いを巡らせてみれば、シフト を使っている部分が多々あるはずです。 CPU内部で実際に使われる部品(演算)に近いものなので、うまく 使えば、高等な部品を使うのと比べて無駄なく速く処理できます。 たとえば、printf("%x",○○○) は4ビットシフトとANDで4ビッ トづつ切り出して文字列を自作すれば、printf()という汎用変換関数 でを使うよりはかなり速く処理できます。 "%x"が固定でやることが決まっていての話ですが。 内部で実行されている手順のうち、必要最小限なものだけを抽出しよ うとして、手順を細かく分解していくと、行き着く先にシフト命令が あるわけです。
- jacta
- ベストアンサー率26% (845/3158)
一番分かりやすいのは、8ビットの値を2つ使って16ビットの値を作るような場合です。 具体例を書くと、 unsigned char high = 0x12; unsigned char low = 0x32; unsigned short word = high << 8 | low; のような使い方をします。 逆に、16ビットの値から上位8ビットと下位8ビットを分離するには、 unsigned short word = 0x1234; unsigned char high = word >> 8; unsigned char low = word & 0xff; のようにします。 こうした処理は、通信プロトコルやバイナリファイルを扱うときは普通に使うので、必要に迫られれば自然に理解できると思います。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
やはり、ハードウエアよりの話ですが、シリアル―パラレルの変換にも使われますね。 シリアルというのは、データがひとつの信号線から、 010101101010110111 のように、順次流れてくる形式。 これを、最終的には(たとえば、メモリに書き込む、ハードディスクに書き込むなど)8個なり16個なり32個の固まりで行う必要があります。 これをたとえば、 0 -> 00000000(1ビット受信して右シフト) 1 -> 10000000(以下同じ) 0 -> 01000000 1 -> 10100000 1 -> 11010000 1 -> 11101000 0 -> 01110100 1 -> 10111010 8個そろったので、10111010 をまとめて送り込む というような処理をします。
- moritan2
- ベストアンサー率25% (168/670)
ビットシフトを使うことはハードを直接さわるプログラミングでは必須です。用途は数え切れませんが、一例をあげれば、たとえばゲーム機で16ビットカラー ARGB1555のデータから、たとえば赤を取り出す時は red = (color >> 10) & 0x1f; とかします。
- Interest
- ベストアンサー率31% (207/659)
マイコン制御プログラムの実例を挙げます。 あるマイコンでは12bitの精度を持つAD変換を行った結果が16bitのレジスタの上位から埋まっていきます。このとき、下位4bitにはAD変換とは関係ない値が入っています。16bitのレジスタから意味のある上位12bitだけを取り出すために、 value = AD.DAR >> 4; というふうにビットシフトを使います。
- don_go
- ベストアンサー率31% (336/1059)
1)ビット状態の判定や、ビットのセット(TestBit |= CheckBit) 等に使います。 unsigned char CheckBit; unsigned char TestBit; int jj; TestBit = xxxx; // 任意のビット値をセット CheckBit = 0x1; for(jj = 0; jj < 8; jj++){ if((TestBit & CheckBit) != 0) { printf("Bit %d On\n", jj); } CheckBit <<= 1; } 2)ビットパターンの合成・分割 unsigned int TestDat; unsigned char HighBit; unsigned char LowBit; TestDat = 0x12 + (0x34 << 8); HighBit = (TestDat & 0xff00) >> 8; LowBit = TestDat & 0xff; 3)暗号化・暗号の復号化