package me.day03.operator;
public class DataOperationsExample {
public static void main(String[] args) {
// operations(연산), operator(연산자), operand(피연산자), expression(연산식)
int aa;
// aa += 3; // 초기화 안됐으므로 에러 (aa = aa + 3)
//// 산술
int a = 5;
int b = 2;
System.out.println(a/b); // 2
System.out.println(a%b); // 1
//// 문자열 연결 +
//// 대입
a = 10;
a -= 3; // a = a - 3
System.out.println(a); // 7
System.out.println(a - 3); // 4
System.out.println(a); // 7
//// 증감
int a1 = 10;
a1++; // a = a + 1
System.out.println(a1); // 11
++a1; // a = a + 1
System.out.println(a1); // 12
int a2 = 10;
int val = a2++; // val = a2; -> a2 증가
System.out.println(val); // 10
System.out.println(a2); // 11
int val2 = ++a2; // a2 증가 -> val = a2;
System.out.println(val2); // 12
System.out.println(a2); // 12
//// 논리 : !, &&, || (not, and, or)
if (a>=1 && a<=10) { // 1<=a<=10 불가 (파이썬은 가능)
System.out.println("1~10"); // 전부 참일때 출력
}
if (!(a>=1 && a<=10)) { // a<1 || a>10 (반전)
System.out.println("1~10");
}
//// 조건
int min = (a < b)? a : b;
// if (a < b) min = a;
// else min = b;
// 와 동일
Math.min(2, 3); // 2 (더 작은것 반환) // Math.min() 함수도 조건 연산자로 구현되어 있음
// 삼항 연산자에서 피연산자 세개 가능
int score = 80;
char grade = (score > 90) ? 'A' : ((score > 80) ? 'B' : 'C');
System.out.printf("%d점은 %c 등급입니다\n", score, grade);
//// 비트 : ~, &, |, ^
// ~00000000 = 11111111
// 00000010 & 00000011 = 00000010
// 00000010 | 00000011 = 00000011
// 코드에 분기가 많이 생길때의 문제점은?
// 조건식도 이진수 -> 십진수, true/false 판단 할때 실행 stop 하므로 시간 오래 걸림
int data = 3;
if (data >= 0 && data < 256) System.out.println("0~255");
else System.out.println("not valid");
// 조건문 대신 비트 연산자로 분기 줄일 수 있음 (삼성 기출)
// 0 = 00000000, 1 = 11111111
// [들어온 데이터의 이진수] & 10000000 의 첫번째 자리가 1 나오면 255보다 큰것
// 어차피 하드웨어는 이진수로 비트 연산 하므로 조건 분기 안하고 비트 연산 하면 속도 빨라짐 (자바도 연산자 내부 구현은 다 C, C++ 네이티브)
// 다만 data = -1 이면 if 조건식의 앞부분만 수행 후 뒷부분은 수행 안되므로 조건식의 해석 빠른경우도 있음 (연산자의 단축 계산)
// || 도 마찬가지
//// 쉬프트 : >>, <<, >>>
// 10 * 2 보다 1010 << 1 이 더 빠름 (20)
// 1010 << 1 == 10100 == 2^0*0 + 2^1*0 + 2^2*1 + 2^3*0 + 2^4*1 == 20
// 1010(2) == 10(10), 비트를 왼쪽으로 한번 쉬프트하면 *2 와 같음 (뒤에 0 하나 생긴다)
// cf
// 1010<<2 == 101000 == 10*2^2 == 40
// 1010>>1 == 101 == 10/2^1 == 5 (맨뒤가 1이여도 탈락됨)
// 1010>>2 == 10 == 10/2^2 == 2 (비트에서 소수점은 무시)
// 하드웨어, 압축에서 최적화와 관련
}
}