요일을 비트로 매핑하기

말하는 감자·2025년 5월 30일

내일배움캠프

목록 보기
64/73

여기서 구독을 완료하고
로그인을 했을 때 내 구독정보를 확인하고자 한다!!!!

그런데, 구독정보에서 사용자마다 선택한 요일도 다르고 갯수도 다르기 때문에 어떻게 관리할지 고민이 됐다

를 튜터님께 다같이가서 상담했을때 비트로 관리하는 좋은 방법을 알려주셔서 적용해보고자 한다!!!








요일비트 위치비트 값
일요일01 << 0 = 1
월요일11 << 1 = 2
화요일21 << 2 = 4
수요일31 << 3 = 8
목요일41 << 4 = 16
금요일51 << 5 = 32
토요일61 << 6 = 64

이런식으로 각 자리마다 한칸씩 차지하는 것이다
일요일이 0값이니 가장오른쪽에 서겠고..

사용자가 월·수·금을 선택했다면:
→ 2 + 8 + 32 = 42
→ 0b101010

이런식으로 표현이 된다

중복된 값이 나올수가 없으니 int로 표현된 요일값은 항상 정해진 값이 나올수 밖에없음
(42를 2의 제곱수의 합 + 겹치지 않는 값 으로 표현하는 방법이 딱 하나인 것)







요일 표기를 위해서 이넘사용!!

@Getter
@RequiredArgsConstructor
public enum DayOfWeek {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}



이렇게 되는 함수가 필요하다
요일을 여러개 지정할 수 있으니깐 중복제거한 List인 Set를 선언해줌
Set<DayOfWeek> -> int 일때 안의 요소들을 for문 돌면서
DayOfWeek -> int 으로 바꿔서 나중에 다 더하기하면 됨

그으 러긴 위해선
ENUM 에다가 각 요일에 맞는 비트값을 넣어주고
DayOfWeek -> int , int -> DayOfWeek 으로 바꿔주는 함수 더해주면되겠지

@Getter
@RequiredArgsConstructor
public enum DayOfWeek {
    SUNDAY(0),
    MONDAY(1),
    TUESDAY(2),
    WEDNESDAY(3),
    THURSDAY(4),
    FRIDAY(5),
    SATURDAY(6);

    private final int bitIndex;

    public int getBitValue() {
        return 1 << bitIndex;
    }

    public static boolean contains(int bits, DayOfWeek day) {
        return (bits & day.getBitValue()) != 0;
    }
}

이게 DayOfWeek -> int 바꿔주는 함수고
이게 int -> DayOfWeek 으로 바꿔주는 함수다.

    // Set<DayOfWeek> -> int
    public static int encodeDays(Set<DayOfWeek> days) {
        int result = 0;
        for (DayOfWeek day : days) {
            result |= day.getBitValue();
        }
        return result;
    }

    // int -> Set<DayOfWeek>
    public static Set<DayOfWeek> decodeDays(int bits) {
        Set<DayOfWeek> result = EnumSet.noneOf(DayOfWeek.class);
        for (DayOfWeek day : DayOfWeek.values()) {
            if (DayOfWeek.contains(bits, day)) {
                result.add(day);
            }
        }
        return result;
    }

이걸 Subscription 클래스에 붙여줘서 바뢉바로꺼내기 하면되겠따~!!!

profile
대충 데굴데굴 굴러가는 개발?자

2개의 댓글

comment-user-thumbnail
2025년 6월 2일

바이트를 8분할 해서 비트로 성능 최적화까지... 오늘도 배워갑니다

1개의 답글