
No.6ベストアンサー
- 回答日時:
掛け算、割り算の代わりに使う事ができます。
ある数を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
こちらの方が普通に掛け算するよりも演算速度が速いそうです。
No.7
- 回答日時:
確かに単体では使いどころの難しい演算ですね。
乗除算をシフトと加減算の組み合わせで実現したので、CPU自体に
そういう命令語を持っています。
もっと高等な(人間の思考回路に近い)命令語もたくさんあるので、
それで足りれば使う必要もないと思いますが、その処理を実現するた
めにCPU内部で行われている手順に思いを巡らせてみれば、シフト
を使っている部分が多々あるはずです。
CPU内部で実際に使われる部品(演算)に近いものなので、うまく
使えば、高等な部品を使うのと比べて無駄なく速く処理できます。
たとえば、printf("%x",○○○) は4ビットシフトとANDで4ビッ
トづつ切り出して文字列を自作すれば、printf()という汎用変換関数
でを使うよりはかなり速く処理できます。
"%x"が固定でやることが決まっていての話ですが。
内部で実行されている手順のうち、必要最小限なものだけを抽出しよ
うとして、手順を細かく分解していくと、行き着く先にシフト命令が
あるわけです。
No.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;
のようにします。
こうした処理は、通信プロトコルやバイナリファイルを扱うときは普通に使うので、必要に迫られれば自然に理解できると思います。

No.4
- 回答日時:
やはり、ハードウエアよりの話ですが、シリアル―パラレルの変換にも使われますね。
シリアルというのは、データがひとつの信号線から、
010101101010110111 のように、順次流れてくる形式。
これを、最終的には(たとえば、メモリに書き込む、ハードディスクに書き込むなど)8個なり16個なり32個の固まりで行う必要があります。
これをたとえば、
0 -> 00000000(1ビット受信して右シフト)
1 -> 10000000(以下同じ)
0 -> 01000000
1 -> 10100000
1 -> 11010000
1 -> 11101000
0 -> 01110100
1 -> 10111010
8個そろったので、10111010 をまとめて送り込む
というような処理をします。
No.3
- 回答日時:
ビットシフトを使うことはハードを直接さわるプログラミングでは必須です。
用途は数え切れませんが、一例をあげれば、たとえばゲーム機で16ビットカラー ARGB1555のデータから、たとえば赤を取り出す時はred = (color >> 10) & 0x1f;
とかします。
No.2
- 回答日時:
マイコン制御プログラムの実例を挙げます。
あるマイコンでは12bitの精度を持つAD変換を行った結果が16bitのレジスタの上位から埋まっていきます。このとき、下位4bitにはAD変換とは関係ない値が入っています。16bitのレジスタから意味のある上位12bitだけを取り出すために、
value = AD.DAR >> 4;
というふうにビットシフトを使います。
No.1
- 回答日時:
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)暗号化・暗号の復号化
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- その他(ホビー) リューターの精度 1 2023/08/27 13:29
- その他(OS) Windows11 HOME でアカウントの追加 3 2023/06/14 17:07
- Oracle ビットで表せる数値について 3 2022/09/12 16:37
- 日用品・生活雑貨 マグネットシートの便利な活用方法を教えてください。 1 2023/05/27 22:43
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- Chrome(クローム) Chrome のブックマーク エクスポートすれば他のPCでも同じようにネットが使える? 1 2022/12/17 06:41
- CPU・メモリ・マザーボード 今使っているノートパソコンのメモリを増設・交換?したいのですが、どうすれば良いのか、何を買ったら良い 10 2022/11/29 15:02
- 物理学 量子コンピュータは量子ビットというものを使って計算するらしいですが、量子を箱の中に入れた状態で計算し 1 2023/02/12 19:29
- DIY・エクステリア 瞬間強力接着剤の使い勝手について 4 2022/04/13 07:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
文字参照は10進数と16進数では...
-
C言語で128bitの2進数のビット...
-
整数除算の意味とは?
-
Endianについて パート2
-
小数点の引き算が不正確
-
2の補数
-
エクセルVBAのIf,Then 構...
-
一般のソフトで画像を扱う場合...
-
アセンブラからC言語に変換する...
-
ライン数とステップ数の違いは?
-
アセンブラのLA
-
このアセンブラの意味を教えて...
-
CommXのサイトを教えてください。
-
レジストってなんですか?
-
PIC16F1シリーズマイコンのNCO...
-
SRAMとレジスタの違いは何でし...
-
初心者です。アセンブラの習得...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
一般のソフトで画像を扱う場合...
-
ビットシフトってどんな時使うの?
-
16ビットCPUで32ビットの計算方法
-
C言語で128bitの2進数のビット...
-
文字参照は10進数と16進数では...
-
verilog 符号付加減算(最上位...
-
シーケンス制御についての質問...
-
エクセルVBAのIf,Then 構...
-
命令について
-
ビット列を表示するプログラム
-
三菱シーケンサーの命令でFROM ...
-
プログラム
-
ビット演算子
-
03分22秒36のような時間の単位...
-
C言語やC++言語でビット毎に値...
-
3進数を10進数に変換
-
ビットの取り出し方法
-
PS3に搭載されている"Cell"は、...
おすすめ情報