본문 바로가기

프로그래밍/CS

연산자

연산자 우선 순위

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_VALUEint 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