From 34299217c0de1ad333eb692f3b7ad391a43251e9 Mon Sep 17 00:00:00 2001 From: FreeArtMan Date: Wed, 14 Oct 2015 21:49:10 +0100 Subject: Divide by 20 only with shifting and substract --- test/div20.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 test/div20.c diff --git a/test/div20.c b/test/div20.c new file mode 100644 index 0000000..1003ab8 --- /dev/null +++ b/test/div20.c @@ -0,0 +1,60 @@ +#include +#include +#include + + +/* +Page about div +http://bisqwit.iki.fi/story/howto/bitmath/#DivAndModDivisionAndModulo +*/ + +uint8_t div20u8( uint16_t num ) +{ + uint16_t a = num; + uint16_t b = 20; + uint16_t r = 0; + uint16_t m = 1; + while ( b < a ) + { + b = b << 1; + m = m << 1; + } + do + { + if ( a >= b ) + { + a = a - b; + r = r + m; + } + b = b >> 1; + m = m >> 1; + } while ( m != 0 ); + return (uint8_t)r; +} + +int main() +{ + uint32_t a = 10000; + uint32_t b = 5; + uint32_t r = 0; + uint32_t m = 1; + printf("%04x(%d) %04x(%3d) %04x(%3d) %04x(%3d)\n",a,a,b,b,r,r,m,m); + while ( b < a ) + { + b = b << 1; + m = m << 1; + printf("%04x(%3d) %04x(%3d) %04x(%3d) %04x(%3d)\n",a,a,b,b,r,r,m,m); + } + do + { + if ( a >= b ) + { + a = a - b; + r = r + m; + } + b = b >> 1; + m = m >> 1; + printf("%04x(%3d) %04x(%3d) %04x(%3d) %04x(%3d)\n",a,a,b,b,r,r,m,m); + } while ( m != 0 ); + return 0; +} \ No newline at end of file -- cgit v1.2.3