1000000
가 되는데 이를 가지고 Xcm을 만들자.import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(br.readLine());
int count = 0;
for (int i = 0; i <= 6; i++) {
if ((x & (1<<i)) != 0) count++;
}
System.out.println(count);
}
}
for
루프는 64의 비트 수 만큼 도는데, 루프 내에서 (x & (1<<i))
로 판단하면 된다.
정수의 2진수 표현을 자료 구조로 쓰는 기법을 말한다.
map<vector<bool>, int>
를 비트마스크를 사용해 단순히 int[]
로 만들 수 있다.연산 | 코드 |
---|---|
두 정수 a,b를 비트별로 AND 연산 | a & b |
두 정수 a,b를 비트별로 OR 연산 | a | b |
두 정수 a,b를 비트별로 XOR 연산 | a ^ b |
정수 a의 비트별 NOT 연산 결과 | ~a |
정수 a를 왼쪽으로 b비트 시프트 | a << b |
정수 a를 오른쪽으로 b비트 시프트 | a >> b |
한 피자집에는 0부터 19까지의 번호를 갖는 스무 가지의 토핑이 있으며, 주문 시 토핑을 넣기 or 넣지 않기를 선택할 수 있다. 이렇게 하면 한 피자의 정보는 스무 종류의 원소만을 가지는 집합이 되고, 비트마스크를 이용해 표현할 수 있게 된다.
int fullPizza = (1 << 20) - 1;
toppings |= (1 << p);
if (toppings & (1 << p)) System.out.println("peperoni is in");
toppings &= ~(1 << p);
toppings ^= (1 << p);
int added = (a | b); // a와 b의 합집합
int intersection = (a & b); // a와 b의 교집합
int removed = (a & ~b); // a에서 b를 뺀 차집합
int toggled = (a ^ b); // a와 b중 하나에만 포함된 원소들의 집합
public int bitCount(int x) {
if (x == 0) return 0;
return x % 2 + bitCount(x/2);
}
또는 Integer.bitCount(toppings)
사용
int firstTopping = (toppings & -toppings);
또는 Integer.numberOfTrailingZeros(toppings)
사용
toppings &= (toppings - 1);
for (int subset = pizza; subset; subset = ((subset-1) & pizza)) {
// subset은 pizza의 부분집합
}