본문 바로가기

IT自主学習 (2023.05.23~)/Java(2023.05.23~)

プログラミング自主学習 31日目 ビット論理演算子/ビット移動演算子/代入演算子/条件演算子(三項演算子)/条演算の方向性と優先順位/Switch

 ビット論理演算子

<概念>

ビット論理演算子はbit単位で論理演算を行い、0と1が被演算子になるため、

2進法を扱うbyte,short,int,longが被演算子にある。

主に通信業界で扱う演算で、メッセージのエラー、bit単位で解釈する際に使われる。

 

AND (&)  二つの二進法の数が1であれば、演算結果が1になる。その他は0だ。

 

0 0 1 0 1 1 0 1  = 45

      &

0 0 0 1 1 0 0 1  = 25

 

0 0 0 0 1 0 0 1  =9(結果)

 

OR(|)二つの二進法の数の中で一つのビットが1であれば、演算結果が1になる。

 

0 0 1 0 1 1 0 1  = 45

      |

0 0 0 1 1 0 0 1  = 25

 

0 0 1 1 1 1 0 1  = 61 (結果)

 

 

XOR()二つの二進法の数の中でいつのビットのみ1であれば、演算結果が1になる。その他は0だ。

 

0 0 1 0 1 1 0 1  = 45

      ^

0 0 0 1 1 0 0 1  = 25

 

0 0 1 1 0 1 0 1  = 52(結果)

 

NOT() 演算結果が逆になる。

 

0 0 1 0 1 1 0 1  = 45

      ~

1 1 0 1 0 0 1 0  = -46

 

変数の演算と同様、基本的にint型(32bit)に変換され、演算される。

 

<実例>

Cには範囲が0~255であるuint8_tタイプのデーターがある。

こちらをjavaに変換するとこのような流れになる。

 

C 1 0 0 1 1 0 0 0 (136)  ---------------------->  java 1 0 0 1 1 0 0 0 (-120)

 

こちらにビット論理演算子を活用すると

byte recieveData = -120;

int unsignedInt = receiveData & 255

 

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 

&                                                                                

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0

 

=136 

 

本来の136に変換される。

 

このような方法もあるが、javaはByte.toUnsignedInt()コードを提供する。

 

byte recieveData = -120;

int unsignedInt =Byte.toUnsignedInt(receiveData); //136

 

https://github.com/HyonHyonKOR/Thisisjava/blob/main/Chapter3/sec09/BitShiftExample.java

                                         


                                   

ビット移動演算子

1.a << b 整数a左にbほど移動(a*2のb条、右のブランクは0になる)

1<<3 = 1*2^3 = 8 

 

2.a >> b 整数a右にbほど移動(a/2のb条、左のブランクはMSBと同じ値になる)

-8>>3 = -8/8 = -1

 

3. a >>> b 整数a右にbほど移動(左のブランクは0になる)

 

https://github.com/HyonHyonKOR/Thisisjava/blob/main/Chapter3/sec09/BitShiftExample2.java

 

GitHub - HyonHyonKOR/Thisisjava

Contribute to HyonHyonKOR/Thisisjava development by creating an account on GitHub.

github.com

 


代入演算子

変数+=被演算子 :変数の値に被演算子の値を足した後、変数に代入する。

  -=                                                             

       *=

       /=

      %=

      &=

      |=

     ^=

     <<=

    >>=

   >>>=

 

等号の前にある算出演算子・ビット演算子により結果値が異なる。

 

https://github.com/HyonHyonKOR/Thisisjava/tree/main/Chapter3/sec10

  


条件演算子(三項演算子)

条件式 ? 値もしくは演算式(true) :  値もしくは演算式(false)

 

package ch03.sec11;

 

public class ConditionalOperationExample {

public static void main(String[] args) {

int score = 85;

char grade = (score>90) ? 'A':(score>80? 'B':'C');

System.out.println(score + "점은 " +grade +"등급입니다.");

}

}

 

<result>

85점은 B등급입니다


条演算の方向性と優先順位

代入演算子や単項演算子(符号、増減)、~、!演算子は演算方向が逆だ。

例)a=b=c=5;

c=5 -> b=c -> a=b 

 

優先順位

無()>単項演算子(符号、増減[++,--]、!、~)>算術 > 比較 > 論理> 代入

 

 

https://github.com/HyonHyonKOR/Thisisjava/commit/ecd2812044d0e07ad65942e5f6b5042e17f89fe8

 

Add files via upload · HyonHyonKOR/Thisisjava@ecd2812

HyonHyonKOR committed Jun 26, 2023

github.com


SWITCH

1. switch(変数){case 変数: 命令文 ; break; }  ;が一般的なケースだ。

変数のケースをはっきり把握できる際に使えば、else if より綺麗にコードをまとめることができる。

最後のelseはdefault: 命令文が付く。breakはいらない。

 

2. switchの変数は整数(byte,short,char,int,long)と文字列のみ代入できる。

実数(double, float)は代入できない。

 

3.breakなしで、綺麗にまとめることもできる。

<単一値>

char grade = 'b'


switch(grade) {
case 'a'"A" -> {System.out.println("優秀会員です。")}

case 'b''B'  -> {System.out.println("一般会員です。")}

default       -> {System.out.println("ゲストです。")}

}

 

or

 

switch(grade) {
case 'a'"A" -> System.out.println("優秀会員です。")

case 'b''B'  -> System.out.println("一般会員です。")

default       -> System.out.println("ゲストです。")

}

 

<中括弧の活用>

単一値の場合はー>で値を代入することができ、

中格好を活用する際にはyieldを使用して値を代入することができる。

その場合はdefault; が必須になり、switchの;を付ける

 

例>

int grade ='b';

 

int score = switch(grade){

    case "A"->100;

    case "B" -> {

        int result = 100-20;

       yield result;

     }

default -> 60;

};

System.out.println(score)