absent = [7, 10, 12]
로 표현하지 않고,
b’11110101 10111111’
다음과 같이 이진수로 표현하는 것.
A = -1
-1을 이진수로 표현하면, 16비트(+부호비트 1비트)기준 10000000000000001
이 된다.
이를 2의 보수로 취하면 01111111111111111
이 되기 때문에,
-1로 표현 후 2의 보수를 취하면 쉽게 모든 원소를 포함시킬 수 있다.
i+1번째 원소를 삭제하려면 다음과 같은 식을 사용하면 된다.
num & ~(1<<i)
아ㅜ 머리아프니까 이진수로 생각해보자.
5를 이진수로 한 0101
이 있는데, 내가 여기서 왼쪽에서 세번째 1을 지워서 0001
로 만들고 싶다고 가정하고 손컴파일을 해보자.
n = 3 - 1 # 지우고싶은 자리, -1한 이유는 i+1번째기때문
0101 & ~(1<<n)
->
0101 & ~(1<<2)
->
0101 & ~(0100)
->
0101 & 1011
->
0001
와개쩐다
원리를 알아보자면, 지우고 싶은 데이터를 1<<n을 사용해서 지정을 하고(0100
), 그 데이터를 1의 보수를 취해서 논리곱을 취한다.
풀어 말하자면 논리곱은 두 항이 다 1이어야 1이 되기 때문에, 0100
을 보수 취해서 1011
, 즉 다른 데이터는 다 살려놓되 지우고싶은 데이터만 0으로 처리하여 죽이는 원리이다.
진짜 만든사람 천잰가.?
num | (1<<i)
대충 느낌은 오는데 '대충'이란 말은 조은 말은 아니니. 손컴파일 해보쟈.
n = 2 - 1 # 0111로 만들고 싶음.
0101 | (1<<n)
->
0101 | (1<<1)
->
0101 | 0010
->
0111
원리 설명을 하자면, 포함시키고 싶은 데이터를 체크(0010
) 후, 이를 논리합 연산해서 더하는 원리이다. 따로 보수를 취할 필요는 없고 포함시키고 싶은 데이터만 1, 나머지는 0으로 처리하면 논리합 특성에 따라서 자동으로 해당 데이터가 포함되는 원리.
num ^ (1<<i)
아니 XOR 왜쓰냐고 으악으악!!!!!이라고 할라했는데 대충 예상이 가는 것 같기도
11, 00은 false고 01이나 10은 true니까 특정 원소에 1을 넣는다고 가정했을 때 XOR하면
무조건 토글이 되는게 아닐까
0일 경우 false였음 -> 0이랑 1이랑 XOR -> true
1일 경우 true였음 -> 1이랑 1이랑 XOR -> false
미쳤다 손컴파일을 해보자
n = 2 - 1 # 0110을 0100로 만들어보자
0110 ^ (1<<n)
->
0110 ^ 0010
->
0100
예측 성공!!!!
num & (num-1)
->
0101 & 0100
->
0100
원리 설명없이 이건 간단하게 1을 빼고 그거랑 논리곱해서 삭제하는 연산.
비트시프트 두번하면 될것같다 ~~~!!!
num >> 1 << 1
->
0101
->
0010
->
0100
또머잇지 NOR쓰면 될것같은데
1이랑 nor하면 마지막 원소는 무조건 0이 될테니
(num ~| 1) # 이런 연산자 엄나 ㅜ
->
(0101 ~| 0001)
->
(1010) ? 이상해짐
생각을 잘못한 것 같다 NOR은 0,0이면 true가 반환돼서,,, NAND쓰는건 어떨까
(num ~& 1) # 있는 연산자라고 가정하고...
->
(0101 ~& 0001)
->
(0100) 오 정답
좋은 생각이여쓰
num & -num
->
0101 & 1011
->
0001
0110 & 1010
->
0010
와 신기하다
아하 2의보수 취하면 1의 보수를 취하고 더하는거니 이론상 1을 만났을 때 바뀌므로 2의 보수 취한 것과 논리곱하면 마지막만 얻을 수 있따