lesson4 1/2 演算 シフト演算

演算子オペランド

フィールド内では、計算ができる。その結果に型を指定し格納できる「代入」。

この時、プラス・マイナス・かける等の直接指示を出す記号が、「演算子(オペレーター)」。対して、演算の対象となる「変数」を「オペランド」と呼ぶ。これを組み合わせて式をつくる。こんがらない様に宣言から計算結果の流れを記述する。

int num1;   //データ型を宣言

num1 = 5;  //数値を代入し初期化※数値は何でも良い

num1 = 7 + 9;  //num1に7プラス9の解を代入

 

int num1 = 7 + 9;  //上記3行を1行にしたもの

 

②シフト演算

 シフト演算は左側の数値(下記の場合は20)を2進数にした上で右側(下記の場合は2)の基数分だけ演算子の向きに従いビットシフトする。

byte nam1;

byte num2;

nam1 = 20 << 2;

num2 = 20 >>>2;

 

ⅰ.  左シフト num1

 20を2進数に変換し、2ビット(桁)分にずらす。

この時、左端からはみ出た部分は切り捨てられ、空いた右側の部分には0が挿入される。

10進数の20は、2進数にすると

「0001 0100」

これを左に2ビットずらすと

「0101 0000」になる。 ※10進数へ変換すると「80」。num1には、80が代入される。

結果、左シフトは4倍の数値が返される事になる。

 

ⅱ.  右シフト(符号なし) num2 

 20を2進数に変換し、2ビット(桁)分にずらす。

この時、右からはみ出た部分は切り捨てられ、空いた左側の部分には0が挿入される。

10進数の20は、2進数にすると

「0001 0100」

これを右に2ビットずらすと

「000 0101」になる。 ※10進数に変換すると「5」。num2には、5が代入される。

結果、右シフトは1/4の数値が返される事となる。

しかし、正の数の時は1/4になるが、負の数の時は、1/4にはならない。

 

ⅲ.  データ型のマイナス表記の概念

「byte型」を例に記述する。データ型のbyteは1byte整数で「-128~+127」まで格納できる。

1byte→8bit

1bitは、1桁の0と1

2bitは、2桁の0と1

7bitは、7桁の0と1

8bitは、8桁の0と1

1byte(8bit)は、8桁の1と0で表現できる数になる。

X桁のY進数で表せる最大の数は、「YのX乗-1」で表す。

8bitは、8桁の2進数になるので、

(2×2×2×2×2×2×2×2)-1=(256)-1

マイナスと0の表記があるので、10進法で表現できる数は、(256-1)の半分である。よって「-128~+127」になる。

 byte型は、8桁の2進数(0000 0000~1111 1111)でデータを区別している。※10進数では「0~255」

コンピュータでは、(256-1)のうち半分を割り当てている負の数を、2の補数と呼ばれる方法で表現する。

補数とは、全ビットを反転させて1を加えたものである。

「0000 0001」 →反転→ 「1111 1110」 →1を加える→ 「1111 1111」

2進数の「0000 0001」は10進数では「1」でbyte型でも「1」となる。

2進数の「1111 1111」は10進数では「255」でbyte型では「-1」 となる。

※byte型は127までしか格納でないので255は表現できない。

2進数の「1111 1110」は10進数では「254」でbyte型では「-2」となる。

2進数の「1111 1101」は10進数では「253」でbyte型では「-3」となる。

 コンピュータでは、何ビットで表せるかを先に決めて、上位の空いた桁数を0で埋めておいて0で始まる2進数は正の数で、1で始まる2進数は負の数と判断する。

 

ⅳ.  右シフト(符号あり)

  byte num3

  num3 = 20>>2

 20を2進数に変換して、2ビット分左にずらし、はみ出た部分は切り捨てまでは同だが、空いた部分の先頭は、もともと「1」であったら「1」をもともと「0」であったら「0」が挿入される

結果、マイナスの符号付きの場合であっても、1/4の数値が返される事となる。