ホームページ  >  記事  >  Java  >  Javaシフト演算子の詳しい説明

Javaシフト演算子の詳しい説明

高洛峰
高洛峰オリジナル
2016-12-16 17:00:181597ブラウズ

Java シフト演算子は、<< (左シフト)、>> (符号なし右シフト) の 3 つです。
1. 左シフト演算子
左シフト演算子 << 指定された値のすべてのビットを指定された回数だけ左にシフトします。
1) その一般的な形式は次のとおりです:
value <num は、value 値をシフトするビット数を指定します。
左シフトのルールについて 1 つだけ覚えておいてください。それは、最上位ビットを破棄し、最下位ビットを 0 で埋めることです。
移動されたビット数がその型の最大ビット数を超える場合、コンパイラーはその型の数の剰余を取得します。ビットが移動しました。たとえば、int 型を 33 ビット移動した場合、実際には 332=1 ビットだけが移動します。

2) 演算ルール
すべての数値をバイナリ形式で対応する桁数だけ左に移動し、上位ビットをシフトアウト(破棄)し、下位ビットの空のビットをゼロで埋めます。
左シフトのオペランドが int 型の場合、1 ビット移動するたびに、その 31 番目のビットがシフトアウトされて破棄されます。
左シフトのオペランドが Long 型の場合、1 ビット移動するたびに、その 63 番目のビットは削除されて破棄されます。
左シフトオペランドがbyte型、short型の場合、これらの型は自動的にint型に展開されます。

3) 数学的意味
数値がオーバーフローしないことを前提とすると、正の数値と負の数値の場合、位置を 1 つ左にシフトすることは 2 の 1 乗を乗算することと等価であり、n ビット左にシフトすることは2のn乗に相当します

4) 計算プロセス:
例: 3 <<2 (3はint型)
1) 3を2進数に変換します 0000 0000 0000 0000 0000 0000 0000 0011,
2) 数値の上位ビット (左側) を変換し、他のすべての数値を 2 ビット左にシフトします。
3) 下位ビットの 2 つの空の位置を 0 で埋めます (右側)。 )。得られる最終結果は 0000 0000 0000 0000 0000 0000 0000 1100 で、10 進数に変換すると 12 になります。

移動されたビット数がその型の最大ビット数を超えています。

上位ビット(31ビットまたは63ビット)にシフトされると、値は負になります。次のプログラムはこれを示しています。

// 2 を乗算する簡単な方法としての左シフト。

public class MultByTwo {
public static void main(String args[]) {
int i;
int num = 0xFFFFFFE; (i=0; i<4; i ) {
num = num << 1;
System.out.println(num);
}
}
}

このプログラムの出力は次のとおりです。

536870908

1073741816

2147483632

-32
注: n ビットのバイナリ、最上位ビットは符号ビットであるため、表現される数値範囲は -2^(n-1) ——2^(n-1) -1 となります。 、したがって、法は 2^(n-1) です。


2. 右シフト演算子

右シフト演算子 << は、指定された値のすべてのビットを指定された回数だけ右にシフトします。

1) その一般的な形式は次のとおりです:

value >> num
num は、value 値をシフトするビット数を指定します。
右シフト規則について 1 つだけ覚えておいてください: 符号ビットは変更されず、符号ビットは左に追加されます

2) 演算規則:
バイナリ形式のすべての数値を対応する桁数だけ右に移動します。下位ビット (破棄) と上位ビットをシフトアウトします。空のビットは符号ビットで埋められます。つまり、正の数は 0 で埋められ、負の数は 1 で埋められます。右シフトのオペランドが byte および short の場合型の場合、これらの型は自動的に int 型に展開されます。

例えば、削除する値が負の数の場合、右シフトするごとに左に1を追加します。 削除する値が正の数の場合、右にシフトするごとに左に0を追加します。符号ビット拡張 (符号保存) と呼ばれ、右シフト


演算を実行するときに負の数の符号を維持するために使用されます。

3) 数学的意味

1 ビット右にシフトすることは 2 で割ることと等価であり、n ビット右にシフトすることは 2 の n 乗で割ることと等価です。

4) 計算プロセス
11 >>2 (11はint型)
1) 11の2進数形式は、 0000 0000 0000 0000 0000 0000 0000 1011です

2) 下位桁の下2桁を繰り出す、数値が正であるため、上位ビットにゼロが埋め込まれます。

3) 最終結果は 0000 0000 0000 0000 0000 0000 0000 0010 です。
10進数に変換すると3になります。

35 >> 2 (35はint型)
35をバイナリに変換: 0000 0000 0000 0000 0000 0000 0010 0011
下位ビットの下2桁を繰り出す: 0000 0000 0000 0000 00 00 0000 0000 1000

変換10 進数へ: 8


5) 右シフトする場合、符号は保持されません
右シフト後の値は 0x0f とビット単位の AND 演算され、符号ビットの拡張が破棄され、取得された値は次の添字として使用できます。定義された配列。このようにして、対応する配列要素によって表される 16 進文字が取得されます。
例:

public class HexByte {

public static public void main(String args[]) {
char hex[] = {
'0', '1', '2', '3', '4', ' 5 '、'6'、'7'、
'8'、'9'、'a'、'b'、'c'、'd'、'e'、'f'
};
バイト b = (バイト) 0xf1;
System.out.println("b = 0x" hex[(b >> 4) & 0x0f] hex[b & 0x0f]);}}

(b >> ; 4) & 0x0f の演算プロセス:
b の 2 進形式: 1111 0001
4 桁の数値をシフトアウト: 0000 1111

10 進形式に変換: 0000 1111

b & 0x0f の演算プロセス:
b の 2 進形式は: 1111 0001
0x0f の 2 進形式は: 0000 1111
ビットごとの AND 演算: 0000 0001
10 進形式に変換: 1

そこで、このプログラムは出力は次のとおりです:
b = 0xf1


3. 符号なし右シフト演算子>>>
その一般的な形式は次のとおりです:
value >>> の数を指定します。値をシフトするビット。
符号なし右シフトのルールについて 1 つだけ覚えておいてください: 符号ビット拡張を無視し、最上位ビットを 0 で埋めてください
符号なし右シフト演算子>>> は 32 ビット値と 64 ビット値に対してのみ意味を持ちます。



Java シフト演算子の詳細な説明と関連記事については、PHP 中国語 Web サイトに注目してください。

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