관리 메뉴

Bull

[Algorithm::Bitmask] 가장 오른쪽 1을 1개씩 없애는 법(1111,1110,1100,...) 본문

Algorithm/Theory

[Algorithm::Bitmask] 가장 오른쪽 1을 1개씩 없애는 법(1111,1110,1100,...)

Bull_ 2024. 8. 21. 00:34

 

오른쪽 1 제거

// C++
#include <iostream>
#include <bitset>

int main() {
    unsigned int num = 0xFFFFFFFF;
    
    while (num > 0) {
        std::cout << std::bitset<32>(num) << std::endl;
        //num = num & (num - 1); 
        // 또는
        num -= num & -num;
    }
    
    std::cout << std::bitset<32>(num) << std::endl;
    
    return 0;
}

num -= num & -num 혹은 num = num & (num - 1) 을 해주면 된다.

 

# 결과
11111111111111111111111111111111
11111111111111111111111111111110
11111111111111111111111111111100
11111111111111111111111111111000
11111111111111111111111111110000
11111111111111111111111111100000
11111111111111111111111111000000
11111111111111111111111110000000
11111111111111111111111100000000
11111111111111111111111000000000
11111111111111111111110000000000
11111111111111111111100000000000
11111111111111111111000000000000
11111111111111111110000000000000
11111111111111111100000000000000
11111111111111111000000000000000
11111111111111110000000000000000
11111111111111100000000000000000
11111111111111000000000000000000
11111111111110000000000000000000
11111111111100000000000000000000
11111111111000000000000000000000
11111111110000000000000000000000
11111111100000000000000000000000
11111111000000000000000000000000
11111110000000000000000000000000
11111100000000000000000000000000
11111000000000000000000000000000
11110000000000000000000000000000
11100000000000000000000000000000
11000000000000000000000000000000
10000000000000000000000000000000
00000000000000000000000000000000