- 왼쪽 시프트(«)
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)));
}
}
}
출처