Java - 연산자 + 비트마스킹 쬐끔

Thomas·2023년 5월 22일
0
post-thumbnail

연산자

  • 산술연산자: +,-,*,/,%(나머지), <<, >> -> 비트연산자
  • 비교연산자: >,<, >=, <=ㅡ == !=
  • 논리연산자: &&, ||, !
  • 대입연산자: =, ++, -- | 복합대입연산자: +=, -=, *=...
  • 기타연산자: (type) -> 형변환 연산자, ? : -> 삼항연산자, instance of 연산자

    연산자 우선순위: 산술 > 비교 > 논리 > 대입
    단, 괄호를 감싸주면 괄호안의 연산이 최우선순위로 계산

연산 규칙

연산 전에 두 피연산자의 타입이 다른 경우 타입을 일치시킨다.

  • 두 피연사자의 타입을 같게 일치시킨다. (둘중 저장공간이 크기가 더 큰 타입으로 일치)

    피연산자의 타입이 'double'보다 작은 'float', 'long', 'int', 'short' 타입이면 'double'으로 변환한다
    -이처럼, 변수여러개를 연산했을 때 결과값은 피연사자 중 표ㅕ현 범위가 가장 큰 변수 타입을 가지게 됩니다.

형변환 연산자

전 시간에 해서 생략
형변환 링크

삼항연산자

int x = 1;
int y = 9;
boolean b = (x==y) ? true : false;

instance of 연산자

피 연산자가 조건에 명시된 클래스의 객체인지 비교하여 맞으면 ture 틀리면 false

Parent parent = new Parent();
Child child = new Child();

System.out.println(parent instanceof Parent) // true
System.out.println(child instanceof Parent) // false

비트 연산자

  • Byte를 8등분한게 Bit
  • Bit는 0,1 둘줄의 하나의 값만을 저장하는 컴퓨터가 저장 가능한 가장 작은 단위
  • 컴퓨터의 가장 작은 단위인 Bit이기 때문에 연산중에서 Bit 연산이 가장 빠름
  • 비트 연산을 통해 자리수를 옮길수도 있음
  • 이처럼 Bit의 자리수를 옮기는 것을 비트 연산이라고 한다.
  • << (왼쪽으로 자리수 옮기기), >> (오른쪽으로 자리수 옮기기)
  • 0,1은 2진수 값이기 때문에, 자리수를 왼쪽으로 횟수만큼 2의 배수로 곱셈이 연산되는것과 동일
  • 0,1은 2진수 값이기 때문에, 자리수를 오른쪽으로 횟수만큼 2의 배수로 나눗셈이 연산되는것과 동일

    EX1> 비트연산으로 곱셈
    0101(5) -> 1010(10) : 5*2 = 10

    EX2) 비트연산으로 나눗셈

비트 연산자는 보통 자주 안 쓰겠지 하고 가볍게 넘기는 사람도 있으실텐데
그런 사람들 위해 "비트마스킹"이라는 알고리즘을 살짝 소개 해주도록 하겠다

비트마스킹

이진수를 사용하는 컴퓨터의 연산 방식을 이용하여 정수의 이진수 표현을 자료구조로 쓰는 기법.

장점

  1. 수행시간이 빠르다. -> 대부분 O(1)의 시간 복잡도
    비트의 개수만큼 원소를 다를 수 있기 때문에 연산 횟수가 많아질수록 차이가 커진다.

O(1)이 아닌 경우
1. 비트 연산의. 크기에 따라 시간 복잡도가 증가하는 경우: 비트마스킹 연산이 여러 개의 비트를 동시에 조작하는경우 시간 복잡도가 선형으로 증가할 수 있다.
예를 들어, N비트의 비트마스크를 전체적으로 반전시키는 경우
2. 비트 연산이 반복적으로 수행되는 경우: 비트마스크를 사용하여 여러 번의 연산을 수행하는 경우, 각 연산마다 비트마스크를 업데이트라고 다시 수행해야 할 수 있습니다.

  1. 코드가 짧다
    다양한 집합 연산들을 비트연산자도 한 줄로 작성할 수 있기 떄문에 반복문, 조건문 등을 이용한 코드보다 훨씬 간결한 코드를 작성할 수 있다.

예를 들면 짝수 홀수 구하기

int num 5;
String oddEven = num & 1 ? "Odd" : "Even"; 
  1. 메모리 사용량이 더 적다
    비트마스크를 이용하는 가장 큰 이유!!
    bit가 10개인 경우에는 각 bit당 두가지 경우를 가지기 때문에 2^10 가지의 경우를 10bit 이진수 하나로 표현이 가능하다.

    데이터를 미리 계산 해서 저장해 둘수 있어서 DP에 매우 유용하다

이처럼 하나의 정수로 많은 경우의 수를 표현 할수 있기 떄문에 메모리 측면에서 효율적이다

결론

오늘은 정의 + 장점만 소개 해줬지만
비트 마스킹 알고리즘은 추가적으로 알아야 할게 많다!
코딩테스트때나 프로젝트떄 쓸수 있으니! 아는 만큼 쓸수 있다!!
다음에 자세하게 알고리즘만 다룰 예정임!

profile
Backend Programmer

0개의 댓글