🔓알고리즘/수학

나눗셈 연산속도 최적화 C++

Mawile 2021. 8. 2.
728x90

개발환경 >> Devcpp

언어 >> C++17이상

운영체제 >> Windows10 home

 

 

💉개요

 

안녕하세요!

이번에는 나눗셈연산을 비트연산으로 바꾸는 방법들에 대하여 알아보겠습니다.

 

우선 왜 나눗셈연산을 비트연산으로 바꾸는건가?

나눗셈연산은 곱셈, 덧셈, 뺄셈, 비트연산속도보다 매우느립니다.

만약에 프로그램속도를 최적화하기 위해서는 비트연산으로 바꿔야합니다.

 

그래서 이번에는 비트연산으로 바꾸는 여러가지 방법에 대하여 알아보겠습니다.

 

💉참조

https://stackoverflow.com/questions/5558492/divide-by-10-using-bit-shifts

 

Divide by 10 using bit shifts?

Is it possible to divide an unsigned integer by 10 by using pure bit shifts, addition, subtraction and maybe multiply? Using a processor with very limited resources and slow divide.

stackoverflow.com

💉2 로 나누기

#include <bits/stdc++.h>

constexpr inline int32_t div2(int32_t dividend)
{
	return (int32_t)((dividend) >> 1);
}

int main() {
	const int ans = 100;

	std::cout << div2(ans) << '\n';
}

 

 

 

💉10 으로 나누기

#include <bits/stdc++.h>

constexpr inline int32_t div10(int32_t dividend)
{
	constexpr int64_t invDivisor = 0x1999999A;
	return (int32_t)((invDivisor * dividend) >> 32);
}

int main() {
	const int ans = 100;

	std::cout << div10(ans) << '\n';
}

 

 

💉10x2N 으로 나누기

#include <bits/stdc++.h>

constexpr inline int32_t div5(int32_t dividend)
{
	constexpr int32_t reverseN = 2;
	constexpr int64_t invDivisor = 0x1999999A;
	return (int32_t)((invDivisor * dividend * reverseN) >> 32);
}

constexpr inline int32_t div20(int32_t dividend)
{
	constexpr int64_t invDivisor = 0x1999999A;
	return (int32_t)((invDivisor * dividend >> 1) >> 32);
}

int main() {
	const int ans = 100;

	std::cout << div5(ans) << '\n';
   	std::cout << div20(ans) << '\n';
}

 

💉마치며...

궁금한 부분있으면 댓글로 질문 부탁드립니다.

 


 

728x90

댓글