• 왼쪽 시프트(«)

x « y (x의 비트를 왼쪽으로 y칸 이동)

1111 « 2 = 111100

1111(15) -> 111100(60) , x * 2^y


  • 오른쪽 시프트(»)

x » y (x의 비트를 왼쪽으로 y칸 이동)

1111 » 2 = 11

1111(15) -> 11(3) , x/2^y (나머지 제외 몫)


  • 비트의 보수(~)

0은1, 1은0으로 바꾼다. 32자리를 기준

~x

~0110 = 11111111111111111111111111111001


  • AND(&)

둘다 1인 경우 1을 반환 나머지는 0을 반환

1111 & 1000 = 1000


  • OR( )

하나라도 1인 경우 1을 반환 둘다 0인 경우 0을 반환

1111 1000 = 1111


  • XOR(^)

서로 다른 경우 1을 반환 같은 경우 0을 반환

1111 ^ 1000 = 111


응용문제

{1,2,3,4,-1,-5} 홀수로 구성된 부분 집합을 모두 출력하시오.

import java.util.Arrays;

public class PartElements {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, -1, -5};

        //모든 부분집합의 경우의 수
        for(int i = 1; i < (1 << array.length); i++) {  //i는 1~63까지
            int [] temp = new int[array.length];    // 부분집합의 임시 배열
            int count = 0;
            boolean isOdd = true;
        
            for(int j = 0; j < array.length; j++) { //모든 부분집합의 경우의 수
                if ((i & (1 << j)) !=0) {
                    if (array[j] % 2 == 0) {
                        isOdd = false;
                    } else {
                        temp[count++] = array[j];
                    }
                }
            }
            if (isOdd) System.out.println(Arrays.toString(Arrays.copyOf(temp,count)));
        }
    }
}


출처

https://myjamong.tistory.com/137