반응형
십진수를 이진수로 변환했을 때, 1의 개수 구하는 방법
1. 비트 AND 연산을 사용하는 방법
// 비트 AND 연산 활용방법
// 자연수 n이 주어졌을 때
// n 이 2의 20승보다 작은 경우로 가정 (아래 for문에서 20으로 범위를 잡은 이유)
int cnt = 0;
for (int i=0; i<20; i++)
{
// i 만큼 shift 하며 비트 AND연산하여, 1이 있는 경우 ++
if (n & 0x01 << i)
cnt++;
}
2. bitset 사용하는 방법
// bitset 활용방법
// 자연수 n이 주어졌을 때
// n 이 2의 20승보다 작은 경우로 가정 (아래 for문에서 20으로 범위를 잡은 이유)
#include <bitset>
using namespace std;
// bitset 중에서 1인 비트의 개수를 반환
int cnt = bitset<20>(n).count();
bitset 사용 참고사이트
https://hellowoori.tistory.com/52
STL bitset
STL bitset STL bitset 이란? bitset 헤더파일에서 제공하는 STL로써, 고정된 크기의 N비트 배열을 나타낸다. 이때 채워진 것은 true로 1이며, 채워지지 않은 것은 false이며 0이다. 컴파일시 비트셋의 크기
hellowoori.tistory.com
bitset 사용법
| 헤더파일 | #include <bitset> |
| 선언 | bitset<할당할 비트 수> 변수명 |
| [n] | n + 1 번째(인덱스 n)비트가 1인지 0인지 검사 |
| .test(n) | n + 1 번째(인덱스 n)비트가 1인지 0인지 검사 |
| .all() | 모든 비트(all)가 1이면 1(true) 그렇지 않으면 0(false)을 반환 |
| .any() | bitset 중 하나라도(any) 1이면 1(true)을 반환 한 개라도 1이 없다면, 즉 모두 0일 때 0(false)을 반환 |
| .none() | bitset 중 1이 하나도 없다면(none), 즉 모두 0이면 1(true)을 반환 |
| .count() | bitset 중에서 1인 비트의 개수를 반환 |
| .size() | bitset의 크기를 구한다 |
| .set() | 전체 비트를 1로 셋팅 |
| .set(n, true/false) | n + 1번째(인덱스 n)비트를 1(true)또는 0(false)으로 셋팅 |
| .reset() | 전체 비트를 0으로 리셋 |
| .flip | 전체 비트를 토글. 0은 1로, 1은 0으로 |
| .flip(n) | n + 1 번째(인덱스 n)비트를 토글. 0은 1로, 1은 0으로 |
| .to_string() | 전체 비트를 string화 시킨다 |
| .to_ulong() / .to_ullong() | 전체 비트를 unsigned long / unsigned long long의 값으로 바꿔준다 |
| operator&= operator|= operator^= operator~ |
AND, OR, XOR and NOT 비트 연산을 수행 |
| operator<<= operator>>= operator<< operator>> |
left shift연산과 right shift 연산을 수행 |
반응형
'코딩테스트' 카테고리의 다른 글
| C++ 어느 자연수가 주어졌을 때, 연속된 자연수 합과 일치하는 숫자 (1) | 2022.09.23 |
|---|---|
| C++ vector sort , reverse (0) | 2022.09.22 |
| C++ 최대공약수, 최소공배수 구하는 로직 (0) | 2022.09.22 |
| C++ vector 초기화 방법 및 2차원 vector 행렬 덧셈 로직 (0) | 2022.09.20 |
| C++ 약수 개수를 구하는 로직 (0) | 2022.09.19 |