본문 바로가기

Java/Java

(JAVA) 비트연산(2)

int num = 9;
int i = 3;

 

num의 i 번  index의 bit 값을 읽어오려면 어떻게 해야 할까?

 

 

찾으려는 index의 값을 제외하고 모두 0으로 변환시킨다.

찾으려는 index의 값만 1로 세팅하고 나머지를 모두 0으로 표현한 수를 & 연산을 하면 된다.

public class BitEx {
    public static void main(String[] args) {

        // TODO: [main] junwoochoi 08/02/2020 6:25 오후
        // 3의 3번째 index값이 1이면 true 0이면 false
        //[0] 0 1 1

        System.out.println(getBit(3, 3));
    }

    public static boolean getBit (int i, int index) {
        int shift = 1 << i;

        return (i & shift) != 0 ;
    }
}

특정 index의 값을 세팅하는 함수 구현

// TODO: [] junwoochoi 08/02/2020 6:37 오후
// 특정 index의 값을 1로 변환해서 출력
public static int setBit (int i, int index) {
    int shift = 1 << index;

    return (i | shift);
}

특정 index를 0으로 세팅하는 함수 구현

 

이전과 동일하게 shift 연산을 사용하여 마스크를 구하지만 ~ 을 붙여서 뒤집어 버린다.

// TODO: [] junwoochoi 08/02/2020 6:36 오후
// 특정 index를 0으로 세팅하는 함수 구현
// 5 , 3   0101
public static int clearBits(int num, int index) {
    int shift = ~(1 << index);
    return num & shift;
}

특정 index를 기준으로 왼쪽의 비트를 모두 0으로 초기화하는 연산

 

마스크를 어떠한 식으로 만들면 좋을까?

예를 들어 3번째 index이하 모든 비트를 0으로 초기화하고 싶다고 가정하자

 

101001001   -> 000000001

 

0000111 이런 식의 마스크가 좋을 것 같다.

 

만드는 방법은 1 << 3 하면 1000이고 이것을 ~ 연산을 한 결과 0111이라고 생각할 수도 있지만

 

원래의 값은 00000000 00000000 00000000 00001000 이것인데 ~ 을 하면

                   11111111 11111111 11111111 11111000 이러한 식으로 되므로 완전히 예상한 값이란 다른 결과가 나온다.

 

단순히 1 << 3 결과에서 -1을 해버리면 된다.

 

// TODO: [] junwoochoi 08/02/2020 6:51 오후 
// 특정 index를 기준으로 왼쪽의 비트를 모두 0으로 초기화하는 연산
public static int clearLeftBits (int num, int index) {
    int shift = (1 << index) -1 ;
    return num & shift;
}

특정 index를 기준으로 오른쪽의 비트를 모두 0으로 초기화하는 연산

 

11111111 11111111 11111111 11111111  => -1

 

-1 << (index +1)

// TODO: [] junwoochoi 08/02/2020 6:54 오후 
// 특정 index를 기준으로 오른쪽의 비트를 모두 0으로 초기화하는 연산
public static int clearRightBits (int num, int index) {
    int shift = (-1 << index +1);
    return num & shift;
}

Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/EffectiveStudy

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

 

'Java > Java' 카테고리의 다른 글

(JAVA) Immutable Class  (0) 2020.02.09
(JAVA) equals에 대해서(4)  (0) 2020.02.09
(JAVA) 비트연산(1)  (0) 2020.02.08
(JAVA) equals에 대해서(3)  (0) 2020.02.07
(JAVA) Exceptions in Java (2) - checked, unchecked  (0) 2020.02.04