Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class LightController {
- private int lightStatus;
- /**
- * 인자 n과 status를 전달받아서 n 번째 비트를 status에 따라 1 또는 0으로 설정
- * status가 true이면 1로, false이면 false로 설정
- *
- * lightStatus 값이 이진수로 ...00000000 이라고 했을 때
- * turn(3, true);를 호출한다면 3번 째 비트를 1로 만들어야 하므로 turn(3, true)의 결과는
- * ...00000100
- *
- * 다시 turn(1, true)를 호출한다면
- * ...00000101
- */
- public void turn(int n, boolean status) {
- if(status) {
- this.lightStatus = this.lightStatus | (1 << (n - 1));
- } else {
- // n 번째 비트를 0으로 만들기 위해서
- // 1을 n - 1 만큼 왼쪽으로 시프트 연산을 하고 ~ 연산자를 이용해서 비트를 반전
- // n = 3 이라면
- // 1 << 2
- // => ...00000100
- // => ...11111011 (~ 연산)
- // => 그 후 lightStatus와 & 연산으로 원하는 비트만 0으로 변경
- this.lightStatus = this.lightStatus & ~(1 << (n - 1));
- }
- }
- /**
- * 인자 n을 전달 받아서 lightStatus에서 n번 째 비트의 값이 1이면 true, 아니면 false 반환
- *
- * 예) lightStatus 가 00001101 일 때
- * - 비트의 크기 때문에 오른쪽에서 왼쪽 순으로 읽는다고 했을 때
- * - 첫 번째: 1
- * - 두 번째: 0
- * - 세 번째: 1
- * - 네 번째: 1
- * - 다섯 번째: 0
- * - 여섯 번째: 0
- * - 일곱 번째: 0
- * - 여덟 번째: 0
- *
- * 따라서
- * getNthStatus(1) -> 1
- * getNthStatus(2) -> 0
- * getNthStatus(3) -> 1
- * getNthStatus(4) -> 1
- * getNthStatus(5) -> 0
- * getNthStatus(6) -> 0
- * getNthStatus(7) -> 0
- * getNthStatus(8) -> 0
- * ...
- */
- public boolean getNthStatus(int n) {
- // n번 째에 있는 비트를 첫 번째 자리로 시프트 시킨 후 1과 & 연산을 해서 값이 1 인지 여부를 반환
- // n = 5라면
- // 임의로 다섯 번째 비트의 값이 1이라고 했을 때
- // ...10000
- // ...10000 >> 4
- // => ...1 (다섯 번째 비트 1이 오른쪽으로 4칸 이동해서 첫 번째로 이동됨)
- // 1 & 1 => 1이므로 true 반환
- return (this.lightStatus >> (n - 1) & 1) == 1;
- }
- public static void main(String[] args) {
- LightController controller = new LightController();
- System.out.println(controller.getNthStatus(10));
- controller.turn(10, true);
- System.out.println(controller.getNthStatus(10));
- controller.turn(10, false);
- System.out.println(controller.getNthStatus(10));
- controller.turn(5, true);
- controller.turn(10, true);
- controller.turn(15, true);
- System.out.println(controller.getNthStatus(5));
- System.out.println(controller.getNthStatus(10));
- System.out.println(controller.getNthStatus(15));
- // for 문을 이용해서 짝수 번째 불만 켜기
- for(int i = 1; i <= 32 ; i++) {
- if(i % 2 == 0) {
- controller.turn(i, true);
- } else {
- controller.turn(i, false);
- }
- }
- // 확인
- for(int i = 1; i <= 32; i++) {
- String text = controller.getNthStatus(i) ? "켜짐" : "-";
- System.out.println(i + "번 째 : " + text);
- }
- // 모두 끄기(lightStatus 값을 0으로 하면 모든 비트가 0)
- controller.lightStatus = 0;
- // 번외
- controller.turn(1, true);
- controller.turn(2, true);
- controller.turn(3, true);
- controller.turn(4, true);
- controller.turn(5, true);
- // 위와 같이 1, 2, 3, 4, 5번 째의 비트를 1로 하면 lightStatus의 값을 2진수로 출력하면
- // 2의 5승 - 1
- // 6까지 켜면 -> 2의 6승 - 1
- // 7까지 켜면 -> 2의 7승 - 1 ...
- System.out.println("lightStatus = " + controller.lightStatus);
- System.out.println("(2 ^ 6) - 1 = " + (int)(Math.pow(2, 5) - 1));
- // Math.pow(a, b) 메서드는 자바에서 제공하는 수학 메서드이고, a의 b 제곱수를 계산해줘요~!
- }
- }
Add Comment
Please, Sign In to add comment