シフト
左シフトと右シフトです。
「シフト」はCoddyKit上の無料C Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。
ビットをシフトする
シフト演算子は、整数のすべてのビットを指定した位置数だけ左または右へ移動します。
左シフトは <<、右シフトは >> です。
#include <stdio.h>
int main(void) {
unsigned x = 1;
printf("1 << 3 = %u\n", x << 3);
return 0;
}左シフトで乗算する
n ビット左へシフトすると、符号なしの値は 2 の n 乗倍になります。
1 << 3 は 8、5 << 1 は 10 です。
#include <stdio.h>
int main(void) {
printf("5 << 1 = %u\n", 5u << 1);
printf("3 << 4 = %u\n", 3u << 4);
return 0;
}右シフトで除算する
n ビット右へシフトすると、符号なしの値は 2 の n 乗で割られます。右端からはみ出したビットは破棄されます。
20 >> 2 は 5 です。
#include <stdio.h>
int main(void) {
printf("20 >> 2 = %u\n", 20u >> 2);
printf("7 >> 1 = %u\n", 7u >> 1);
return 0;
}2 のべき乗
1 を左シフトするのは、2 のべき乗を生成する最も速い方法です。
1 << n は 2 の n 乗です。
#include <stdio.h>
int main(void) {
for (int n = 0; n < 6; n++) {
printf("2^%d = %u\n", n, 1u << n);
}
return 0;
}シフトを視覚化する
シフトの前後でビットを出力すると、ビットパターンがどのように移動するかが分かります。
#include <stdio.h>
void print_bits(unsigned char v) {
for (int i = 7; i >= 0; i--) putchar((v >> i) & 1 ? '1' : '0');
putchar('\n');
}
int main(void) {
unsigned char v = 0b00000110;
print_bits(v);
print_bits(v << 2);
return 0;
}ビットを取り出す
ビット番号 i を読み取るには、値を i ビット右へシフトし、1 でマスクします。
結果は 0 または 1 になります。
#include <stdio.h>
int main(void) {
unsigned v = 0b10110;
for (int i = 0; i < 5; i++) {
printf("bit %d = %u\n", i, (v >> i) & 1);
}
return 0;
}ビット単位で値を組み立てる
ビットを所定の位置へシフトし、OR で組み合わせることで、数値を組み立てられます。
#include <stdio.h>
int main(void) {
unsigned v = 0;
v |= (1u << 0);
v |= (1u << 2);
v |= (1u << 4);
printf("v = %u\n", v);
return 0;
}符号付き右シフトの注意点
負の符号付き整数を右シフトした場合の動作は実装依存です。符号ビットがコピーされることがあります。
予測可能なビット操作を行うには、unsigned 型を使用してください。
#include <stdio.h>
int main(void) {
int s = -8;
printf("-8 >> 1 = %d (implementation-defined)\n", s >> 1);
unsigned u = 8;
printf("8u >> 1 = %u\n", u >> 1);
return 0;
}過度なシフトを避ける
型の幅以上の量だけシフトすると、未定義動作になります。
32ビット値を32ビット以上シフトすることは許可されません。
#include <stdio.h>
#include <limits.h>
int main(void) {
printf("unsigned has %zu bits\n", sizeof(unsigned) * CHAR_BIT);
printf("Safe shift 1u << 31 = %u\n", 1u << 31);
return 0;
}シフトとマスクの組み合わせ
シフトとマスクを組み合わせると、複数ビットのフィールドを取り出せます。ここでは、1バイトから中央の4ビットを取り出します。
#include <stdio.h>
int main(void) {
unsigned v = 0b11010110;
unsigned field = (v >> 2) & 0b1111;
printf("field = %u\n", field);
return 0;
}高速な乗算と加算
シフトを組み合わせると、定数による乗算を高速に実行できます。10倍する処理は、3ビットシフト(8倍)と1ビットシフト(2倍)を加算する処理と同じです。
#include <stdio.h>
int main(void) {
unsigned x = 7;
unsigned times10 = (x << 3) + (x << 1);
printf("7 * 10 = %u\n", times10);
return 0;
}理解度チェック
シフトについての知識を確認しましょう。
まとめ
シフト演算子について学びました。
<<は左にシフトし、2の累乗倍します。>>は右にシフトし、2の累乗で割ります。(v >> i) & 1は単一のビットを取り出します。- 予測可能なシフトを行うには
unsignedを使用し、型の幅以上のシフトは決して行いません。
よくある質問
「シフト」レッスンは無料ですか?
はい。「シフト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。
「シフト」で何を学びますか?
左シフトと右シフトです。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「シフト」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC Academyレッスンでコードを書いて実行できますか?
はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。