최하위에서 가장 먼저 등장하는 1을 찾는 비트 연산자
idx = (S & -S);
🚀 이 연산은 S에서 가장 오른쪽에 위치한 1을 제외한 나머지를 모두 0으로 만든다.
int S = 12; // 0b1100
int idx = S & -S;
cout << idx << endl;
S = 0b1100 (12)
~S = 0b0011 (1의 보수)
+1 = 0b0100 (2의 보수) -> -S
S = 0b1100 (12)
- S = 0b0100 (-12)
----------------------
idx = 0b0100 (4)
➡ 결과: idx = 4 (0b0100, 최하위 1만 남음!)
int S = 42; // 0b101010
int idx = S & -S;
cout << idx << endl;
S = 0b101010 (42)
~S = 0b010101 (1의 보수)
+1 = 0b010110 (2의 보수) -> -S
S = 0b101010 (42)
- S = 0b010110 (-42)
----------------------
idx = 0b000010 (2)
➡ 결과: idx = 2 (0b000010, 최하위 1만 남음!)
#include <iostream>
#include <cmath> // log2 함수 포함
using namespace std;
int main()
{
int s = 10; // 0b1010 (십진수 10)
int a = 15; // 0b1111 (십진수 15)
int ind2 = 1;
s &= ~(1 << ind2); // 특정 비트를 0으로 만들기
a ^= (1 << ind2); // 특정 비트를 토글하기
int lowInx = (s & -s); // 최하위 1의 값 찾기
if (lowInx == 0) {
cout << "No set bits found!" << endl;
}
else {
int lowIndex = log2(lowInx); // 인덱스 찾기
cout << "lowest 1's value : " << lowInx << endl;
cout << "lowest 1's index (log2) : " << lowIndex << endl;
}
return 0;
}
lowest 1's value : 8
lowest 1's index (log2) : 3
🔍 비트 연산 정리 (0) | 2025.03.06 |
---|---|
🔍 최하위 켜져 있는 비트 찾기 (S & -S) (0) | 2025.03.06 |
🔍 비트마스크 : &= ~(1 << ind)와 ^= (1 << ind) 연산 (0) | 2025.03.06 |
2의 보수 (Two's Complement) (0) | 2025.03.05 |
비트 연산자 ^ (XOR), << (왼쪽 시프트), >> (오른쪽 시프트) (0) | 2025.03.05 |