ホームページ  >  記事  >  C言語の左シフト演算子と右シフト演算子を理解する方法

C言語の左シフト演算子と右シフト演算子を理解する方法

清浅
清浅オリジナル
2019-03-11 17:28:2256436ブラウズ

C 言語の左シフトは、最上位ビットを破棄して最下位ビットに 0 を追加することを意味する左シフト演算子を意味し、C 言語の右シフトは、左シフトの逆の右シフト演算子を意味します。数箇所右に移動します。

C言語の左シフト演算子と右シフト演算子を理解する方法

C 言語での左シフト演算子と右シフト演算子の使用法: 左シフト演算子は最上位ビットを破棄し、最下位ビットを 0 で埋めます。右シフト演算子はアルゴリズムです。は左シフトの逆です。数ビット右に移動します。

C言語の左シフト演算子と右シフト演算子はC言語の演算子です。この 2 つの演算子の使い方は参考になります。皆様のお役に立てれば幸いです。

[おすすめ講座:C 言語チュートリアル ]

まず、左シフトについて話しましょう。左シフトとは、数値のすべてのビットを特定の桁数だけ左に移動することです。<< 演算子を使用します。 Cで。例:

int i = 1;
i = i << 2;  //把i里的值左移2位

つまり、1 の 2 進法は 000...0001 です (ここでの 1 の前の 0 の数は int の桁数に関係します)。 32 ビット マシンの場合、gcc 0) には 31 があり、2 ビット左にシフトすると 000...0100 (10 進数で 4) になります。したがって、1 ビットを左にシフトすることは 2 を乗算することと同じです。 , n ビットを左にシフトすると、2 の n 乗が乗算されます (左シフトにより符号が変わる可能性があるため、符号付きの数値は完全には適用できません。理由は以下で説明します)
必要な問題が 1 つあります。注意は、m 端の符号ビットが int 型の左端のバスでは報告されず、シフトが外側に移動されることです。int は符号付き整数であり、左端の 1 ビットが符号ビットであることがわかっています。 , 0 正、1 負。シフトするとオーバーフローが発生します。例:

int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000
i = i << 1;

次に、i が 1 ビット左にシフトされると、0x80000000、つまり 100000 になります。 2 進数の .0000。符号ビットは 1 に設定され、他のビットはすべて 0 になります。これが int 型が表現できる最小値になります。32 ビット int の値は -2147483648 となり、オーバーフローします。どうなるでしょうか。 i を 1 ビット左にシフトすると? C 言語では、最上位ビットが破棄され、1 を破棄すると i の値は 0 になります。
左シフトの特殊なケースは、桁数が左にシフトすると数値型の最大桁数を超える場合、コンパイラは左にシフトした桁数をその型の最大桁数を法として使用し、その余りに応じてシフトします。たとえば、次のようになります。

int i = 1, j = 0x80000000; //设int为32位
i = i << 33;   // 33 % 32 = 1 左移1位,i变成2
j = j << 33;   // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

このプログラムを gcc でコンパイルすると、コンパイラは、左シフトの数 >= 型の長さであるという警告を出します。その後、実際には、i と j が 1 ビット移動されます。は 332 の後の剰余です。これは

gcc でのルールです。他のコンパイラでも同じかどうかは不明です。

つまり、左シフトは次のとおりです: 最上位ビットを破棄します

右シフトについて話しましょう。左シフトの原理が理解できれば、右シフトも理解しやすくなります。


右シフトの概念と左シフトの反対は、数ビットを右に移動することです。演算子は > です。符号ビットは変更されずに維持されます。例:

int i = 0x80000000;
i = i >> 1;  //i的值不会变成0x40000000,而会变成0xc0000000

つまり、符号ビットが変更された後、符号ビットは変更されません。右に移動すると、正の数値には 0 が加算され、負の数値には 1 が加算されます。これはアセンブリ言語の算術右シフトです。同様に、移動されたビット数が型の長さを超える場合は、剰余が取得され、

负数10100110 >>5(假设字长为8位),则得到的是  11111101

要するに、C では、左シフトは論理/算術左シフト (この 2 つはまったく同じです)、右シフトは算術右シフトであり、符号は維持されます。実際のアプリケーションでは、左/右シフトを使用して、状況に応じて高速な乗算/除算演算を実行でき、ループ処理よりもはるかに効率的です。

以上がC言語の左シフト演算子と右シフト演算子を理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。