アプリ版:「スタンプのみでお礼する」機能のリリースについて

<<を使うビットシフトってありますよね?
あれってどういうとき使うんでしょうか・・。
使い方が良く解りません。
10進数の2を8に出来たりするようですけど
2を8にしたり
2を32にしたりする事って便利なんでしょうか?

それとももっと他の使い方があるのでしょうか?

ビットシフトを利用した便利な使い方、なぜこのような使い方があるのか教えてくださいお願いします!^^

A 回答 (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
こちらの方が普通に掛け算するよりも演算速度が速いそうです。
    • good
    • 1

確かに単体では使いどころの難しい演算ですね。


乗除算をシフトと加減算の組み合わせで実現したので、CPU自体に
そういう命令語を持っています。
もっと高等な(人間の思考回路に近い)命令語もたくさんあるので、
それで足りれば使う必要もないと思いますが、その処理を実現するた
めにCPU内部で行われている手順に思いを巡らせてみれば、シフト
を使っている部分が多々あるはずです。
CPU内部で実際に使われる部品(演算)に近いものなので、うまく
使えば、高等な部品を使うのと比べて無駄なく速く処理できます。
たとえば、printf("%x",○○○) は4ビットシフトとANDで4ビッ
トづつ切り出して文字列を自作すれば、printf()という汎用変換関数
でを使うよりはかなり速く処理できます。
"%x"が固定でやることが決まっていての話ですが。
内部で実行されている手順のうち、必要最小限なものだけを抽出しよ
うとして、手順を細かく分解していくと、行き着く先にシフト命令が
あるわけです。
    • good
    • 5

一番分かりやすいのは、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;

のようにします。

こうした処理は、通信プロトコルやバイナリファイルを扱うときは普通に使うので、必要に迫られれば自然に理解できると思います。
    • good
    • 3

やはり、ハードウエアよりの話ですが、シリアル―パラレルの変換にも使われますね。



シリアルというのは、データがひとつの信号線から、
010101101010110111 のように、順次流れてくる形式。
これを、最終的には(たとえば、メモリに書き込む、ハードディスクに書き込むなど)8個なり16個なり32個の固まりで行う必要があります。

これをたとえば、

0 -> 00000000(1ビット受信して右シフト)
1 -> 10000000(以下同じ)
0 -> 01000000
1 -> 10100000

1 -> 11010000
1 -> 11101000
0 -> 01110100
1 -> 10111010

8個そろったので、10111010 をまとめて送り込む
というような処理をします。
    • good
    • 3

ビットシフトを使うことはハードを直接さわるプログラミングでは必須です。

用途は数え切れませんが、一例をあげれば、たとえばゲーム機で16ビットカラー ARGB1555のデータから、たとえば赤を取り出す時は
red = (color >> 10) & 0x1f;
とかします。
    • good
    • 2

マイコン制御プログラムの実例を挙げます。



あるマイコンでは12bitの精度を持つAD変換を行った結果が16bitのレジスタの上位から埋まっていきます。このとき、下位4bitにはAD変換とは関係ない値が入っています。16bitのレジスタから意味のある上位12bitだけを取り出すために、

value = AD.DAR >> 4;

というふうにビットシフトを使います。
    • good
    • 2

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)暗号化・暗号の復号化
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!