2의 n제곱 수인지 판별하기
Notepad96
·2020. 11. 7. 09:55
300x250
1. 개 요
2의 n제곱 수를 2진수로 나타낸다면
2의 1제곱 2 -> 10
2의 4제곱 16 -> 10000
2의 6제곱 64 -> 1000000
2의 0제곱 1 -> 1
와 같이 1로 시작하며 오른쪽의 0이 채워지는 형태이다.
그렇다면 이제 각 수에서 1을 뺀 수를 2진수로 나타내보면
(2의 1제곱-1) 1 -> 1
(2의 4제곱-1) 15 -> 1111
(2의 6제곱-1) 63 -> 111111
(2의 0제곱-1) 0 -> 0
그러면 여기서 0제곱을 제외하고는 1로 2진수가 1로 이루어진 것을 확인 할 수 있다.
그렇다면 이와 같은 사실을 이용하여서 임의의 수 n이 2의 제곱수인지 판별할 수 있다.
임의의 수 n과 n-1를 비트 연산자 &를 사용하여 연산하면 n이 2의 제곱 수인 경우 그 결과 0이 도출된다.
2. 코 드
환경 : Visual Studio 2019
#include <iostream>
using namespace std;
bool twoN(int num) {
return (num & (num - 1)) == 0;
}
int main() {
int n[6] = { 1, 17, 64, 1025, 2048, 2047 };
for (int i = 0; i < 6; i++) {
if (twoN(n[i])) {
cout << n[i] << "는 2의 n제곱 수이다.\n";
}
else {
cout << n[i] << "는 2의 n제곱 수가 아니다.\n";
}
}
return 0;
}
이처럼 간편하게 임의의 수 n이 2의 제곱 수인지 판별할 수 있다.
300x250
'C++ > Algorithm' 카테고리의 다른 글
[Algorithm/C++] 버블 정렬(Bubble Sort) - 거품 정렬 (0) | 2022.09.18 |
---|---|
C++ 숫자 각 자릿수 구하기, 문자열 숫자 각 자릿수 구하기 (0) | 2020.11.21 |
C++ Integer to Binary - 2진수 구하기 (0) | 2020.11.19 |
C++ 소수 판별하기 (0) | 2020.11.16 |
C++ 문자열 나누기 - string split (0) | 2020.11.03 |