Guest User

Untitled

a guest
Jan 16th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.23 KB | None | 0 0
  1. public class LightController {
  2. private int lightStatus;
  3.  
  4. /**
  5. * 인자 n과 status를 전달받아서 n 번째 비트를 status에 따라 1 또는 0으로 설정
  6. * status가 true이면 1로, false이면 false로 설정
  7. *
  8. * lightStatus 값이 이진수로 ...00000000 이라고 했을 때
  9. * turn(3, true);를 호출한다면 3번 째 비트를 1로 만들어야 하므로 turn(3, true)의 결과는
  10. * ...00000100
  11. *
  12. * 다시 turn(1, true)를 호출한다면
  13. * ...00000101
  14. */
  15. public void turn(int n, boolean status) {
  16. if(status) {
  17. this.lightStatus = this.lightStatus | (1 << (n - 1));
  18. } else {
  19. // n 번째 비트를 0으로 만들기 위해서
  20. // 1을 n - 1 만큼 왼쪽으로 시프트 연산을 하고 ~ 연산자를 이용해서 비트를 반전
  21.  
  22. // n = 3 이라면
  23. // 1 << 2
  24. // => ...00000100
  25. // => ...11111011 (~ 연산)
  26. // => 그 후 lightStatus와 & 연산으로 원하는 비트만 0으로 변경
  27. this.lightStatus = this.lightStatus & ~(1 << (n - 1));
  28. }
  29. }
  30.  
  31. /**
  32. * 인자 n을 전달 받아서 lightStatus에서 n번 째 비트의 값이 1이면 true, 아니면 false 반환
  33. *
  34. * 예) lightStatus 가 00001101 일 때
  35. * - 비트의 크기 때문에 오른쪽에서 왼쪽 순으로 읽는다고 했을 때
  36. * - 첫 번째: 1
  37. * - 두 번째: 0
  38. * - 세 번째: 1
  39. * - 네 번째: 1
  40. * - 다섯 번째: 0
  41. * - 여섯 번째: 0
  42. * - 일곱 번째: 0
  43. * - 여덟 번째: 0
  44. *
  45. * 따라서
  46. * getNthStatus(1) -> 1
  47. * getNthStatus(2) -> 0
  48. * getNthStatus(3) -> 1
  49. * getNthStatus(4) -> 1
  50. * getNthStatus(5) -> 0
  51. * getNthStatus(6) -> 0
  52. * getNthStatus(7) -> 0
  53. * getNthStatus(8) -> 0
  54. * ...
  55. */
  56. public boolean getNthStatus(int n) {
  57. // n번 째에 있는 비트를 첫 번째 자리로 시프트 시킨 후 1과 & 연산을 해서 값이 1 인지 여부를 반환
  58.  
  59. // n = 5라면
  60. // 임의로 다섯 번째 비트의 값이 1이라고 했을 때
  61. // ...10000
  62. // ...10000 >> 4
  63. // => ...1 (다섯 번째 비트 1이 오른쪽으로 4칸 이동해서 첫 번째로 이동됨)
  64. // 1 & 1 => 1이므로 true 반환
  65. return (this.lightStatus >> (n - 1) & 1) == 1;
  66. }
  67.  
  68. public static void main(String[] args) {
  69. LightController controller = new LightController();
  70.  
  71. System.out.println(controller.getNthStatus(10));
  72. controller.turn(10, true);
  73. System.out.println(controller.getNthStatus(10));
  74. controller.turn(10, false);
  75. System.out.println(controller.getNthStatus(10));
  76.  
  77. controller.turn(5, true);
  78. controller.turn(10, true);
  79. controller.turn(15, true);
  80.  
  81. System.out.println(controller.getNthStatus(5));
  82. System.out.println(controller.getNthStatus(10));
  83. System.out.println(controller.getNthStatus(15));
  84.  
  85.  
  86. // for 문을 이용해서 짝수 번째 불만 켜기
  87. for(int i = 1; i <= 32 ; i++) {
  88. if(i % 2 == 0) {
  89. controller.turn(i, true);
  90. } else {
  91. controller.turn(i, false);
  92. }
  93. }
  94.  
  95. // 확인
  96. for(int i = 1; i <= 32; i++) {
  97. String text = controller.getNthStatus(i) ? "켜짐" : "-";
  98. System.out.println(i + "번 째 : " + text);
  99. }
  100.  
  101.  
  102. // 모두 끄기(lightStatus 값을 0으로 하면 모든 비트가 0)
  103. controller.lightStatus = 0;
  104.  
  105. // 번외
  106. controller.turn(1, true);
  107. controller.turn(2, true);
  108. controller.turn(3, true);
  109. controller.turn(4, true);
  110. controller.turn(5, true);
  111. // 위와 같이 1, 2, 3, 4, 5번 째의 비트를 1로 하면 lightStatus의 값을 2진수로 출력하면
  112. // 2의 5승 - 1
  113. // 6까지 켜면 -> 2의 6승 - 1
  114. // 7까지 켜면 -> 2의 7승 - 1 ...
  115. System.out.println("lightStatus = " + controller.lightStatus);
  116. System.out.println("(2 ^ 6) - 1 = " + (int)(Math.pow(2, 5) - 1));
  117. // Math.pow(a, b) 메서드는 자바에서 제공하는 수학 메서드이고, a의 b 제곱수를 계산해줘요~!
  118. }
  119. }
Add Comment
Please, Sign In to add comment