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