a << b == a * 2^b;
a >> b == a * (1/2)^b
16 >> 2 == 16 (1/2)^2 == 16 1/4 => 4
~value = -(value + 1)
-16의 비트를 알고싶으면은
16의 비트를 ~ 한뒤에 + 1을 해준다.
=>
앞에 비트 더있음 32비트이니까
즉
-(a+1) = ~a 랑 같다.
-a = ~a + 1 이라서
16을 반전 시키면은
a = 16;
~a 는? => -17이다.
이거는 외워야됨.
가만보면 맞는말이다.
Toggle기능 같은 경우
0 -> 1, 1 -> 0으로 만드는 부분이다.
int s = 18;
int idx = 1;
s ^= (1 << idx);
cout << s << endl; // 16
10010
00010
=>
10000 == 16
xor을 통해서 껏다 켯다 가능
켜져있는거 중에서 최하위 비트 찾는 거 말하는거다.
이거 찾는게
idx = (-S & S);
s = 10010
-s = 01101 -> 01110
즉
10010
01110
이거두개 &하면은
00010
최하위 비트 찾음 idx = idx = 2^1
크기가 4인 비트를 모두 킬려면
즉 0 0 0 0 이거를 싹다 1 1 1 1로 킬려면
( 1 << 4 ) - 1 해주면된다.
1 0 0 0 0
- 1
------------
0 1 1 1 1 => 15
1 0 1
- 1
------
1 0 0 => 5 - 1 => 4
1 0
- 1
----
0 1 => 1
S |= 1 << idx