연산자 우선 순위

1. int와 int의 연산 결과는 항상 int
int i = 5; int j = 2;
float f = i / j; // 2.0 -> i / j 값은 이미 int로 확정되었기 때문
f = (float) i / (float) j; // 2.5
int x = Integer.MAX_VALUE; int y = Integer.MAX_VALUE;
System.out.println(x + y); // -2
long r2 = x + y;
System.out.println(r2); // -2
System.out.println((long)x + (long)y); // 4294967294
2. 암시적 형변환(Implicit Type Conversion|Casting)
- 연산은 같은 타입끼리 가능, 다른 타입끼리 연산을 할 때는 둘 중 한 개의 타입을 다른 타입으로 바꿔야 한다.
- byte, short, char => int => long => float => double
- 정수와 부동소수점에 대해서만 암시적 형변환이 일어날 수 있음.
3. 명시적 형변환(Explicit Type Conversion|Casting)
System.out.println((byte) 256); // 0 -> 메모리에 들어가기에 큰 값이면 형 변환 할 때 값이 잘린다.
4. 논리연산자
- 정수 값에 대해서는 사용할 수 없다. TRUE와 FALSE만 비교 가능.
| && | 두 개의 논리 값이 모두 TRUE일 때 TRUE | & | 두 개의 논리 값이 모두 TRUE일 때 TRUE |
| || | 두 개의 논리 값 중 하나라도 TRUE일 때 TRUE | | | 두 개의 논리 값 중 하나라도 TRUE일 때 TRUE |
| ! | NOT |
boolean a = false;
boolean b = false;
boolean r = a && (b = true); // (b = true) 실행X, b의 값은 true로 바뀌지 않고 출력
System.out.printf("a=%b, b=%b, r=%b\n", a, b, r); => a=false, b=false, r=false
a = false;
b = false;
r = a & (b = true); // (b = true) 실행, b의 값이 true로 바뀐 후 출력
System.out.printf("a=%b, b=%b, r=%b\n", a, b, r); => a=false, b=true, r=false
&& : 앞의 피연산자 값으로 결과를 알 수 있으면 뒤의 명령은 실행하지 않는다.
& : 앞의 피연산자로 결과를 알 수 있어도, 뒤의 명령까지 모두 실행한다.
5. 비트연산자
- 이미지 및 영상 처리에 사용된다.
예) 마스킹, 오버레이 기법에 사용
예) 색조 변경에 사용
| & | 둘 다 1일 때 1 | ^ | 둘이 다를 때 1 |
| | | 하나라도 1일 때 1 | ~ | NOT |
System.out.println(a & b);
a = 0000 0000 0000 0000 0000 0000 0110 1100
b = 0000 0000 0000 0000 0000 0000 0101 0101
-------------------------------------------------------
0000 0000 0000 0000 0000 0000 0100 0100 = 68
System.out.println(a | b);
a = 0000 0000 0000 0000 0000 0000 0110 1100
b = 0000 0000 0000 0000 0000 0000 0101 0101
-------------------------------------------------------
0000 0000 0000 0000 0000 0000 0111 1101 = 125
System.out.println(a ^ b);
a = 0000 0000 0000 0000 0000 0000 0110 1100
b = 0000 0000 0000 0000 0000 0000 0101 0101
-------------------------------------------------------
0000 0000 0000 0000 0000 0000 0011 1001 = 57
System.out.println(~a);
a = 0000 0000 0000 0000 0000 0000 0110 1100
-------------------------------------------------------
1111 1111 1111 1111 1111 1111 1001 0011 = -109
6. 비트 이동 연산자
| >> | 비트 오른쪽으로 이동 후, 왼쪽 빈자리 0 => /2 | << | 비트 왼쪽으로 이동 후, 오른쪽 빈자리 0 => *2 |
| >>> | 비트 오른쪽으로 이동 후, 왼쪽 빈자리 1 (음수) |
int i = 1;
0000 0000 0000 0000 0000 0000 0000 0001 = 1
System.out.println(i << 1);
0000 0000 0000 0000 0000 0000 0000 0010 = 2
System.out.println(i << 2);
0000 0000 0000 0000 0000 0000 0000 0100 = 4
i = 0b01101001; (105)
System.out.println(i >> 1); 0011_0100|1 => 52
System.out.println(i >> 2); 00011_010|0 => 26
i = 0b11111111_11111111_11111111_10101001; (-87)
System.out.println(i >>> 1); 1_11111111_11111111_11111111_1010100|1 =>2147483604
System.out.println(i >>> 2); 11_11111111_11111111_11111111_101010|01 => 1073741802 System.out.println(i >>> 3); 111_11111111_11111111_11111111_10101|001 => 536870901
7. 5+6 응용
int i = 0x27a130ff;
00100111_10100001_00110000_11111111
c = (i >> 8) & 0xff;
00000000_00100111_10100001_00110000
& 00000000_00000000_00000000_11111111
--------------------------------------------------
00000000_00000000_00000000_00110000
int lang = 0b1110_0011;
if ((lang & 0x80) == 0x80) System.out.print("c ");
if ((lang & 0x40) > 0) System.out.print("cpp ");
if ((lang & 0x20) > 0) System.out.print("java ");
if ((lang & 0x10) > 0) System.out.print("js ");
if ((lang & 8) > 0) System.out.print("python ");
if ((lang & 4) > 0) System.out.print("php ");
if ((lang & 2) > 0) System.out.print("html ");
if ((lang & 1) > 0) System.out.print("css ");
8. 비트 이동 유효 범위를 벗어날 때 ( int : 32bit, long : 64bit )
n << s
(int) s & 0b11111 = 비트 이동
3 << 33
00000000 00000000 00000000 00000011 = 3
00000000 00000000 00000000 00100001 = 33
* 비트 이동
00000000 00000000 00000000 00000001
& 00000000 00000000 00000000 00011111
--------------------------------------------------------
00000000 00000000 00000000 00000001
(long) s & 0b111111 = 비트 이동
3 << 33 = 3 << (33 % 32) = 3 << 1 = 3 * 2 = 6
3 << 65 = 3 << (65 % 64) = 3 << 1 = 3 * 2 = 6
3 << 97 = 3 << (97 % 32) = 3 << 1 = 3 * 2 = 6
'프로그래밍 > CS' 카테고리의 다른 글
| 자료구조 - Stack vs Queue || Shallow/Deep Copy (0) | 2020.01.13 |
|---|---|
| ArrayList vs LinkedList (0) | 2020.01.12 |
| 메모리 사용 (0) | 2019.12.15 |
| 데이터의 타입 (0) | 2019.12.11 |
| 인터페이스 (0) | 2019.12.11 |