Prevedimo sada program iz paskalolikog jezika (za koji smo dokazali totalnu korektnost), u C program vodeći računa da pri tome ne narušimo invarijantu petlje i korektnost programa.
Prateći algoritam korak po korak, dobija se sledeći C kod programa:
#include<stdio.h> #include<stdlib.h> main() { unsigned int x, y, z1, z2; unsigned int q, r; printf("Unesite brojeve x i y za koje zelite da izracunate celobrojno deljenje:\n"); scanf("%d%d", &x, &y); if(y == 0) { printf("Greska pri unosu vrednosti y!\n"); exit(1); } q = 0; r = x; z1 = y; z2 = 1; while (z1 < r ) { z1 = 2 * z1; z2 = 2 * z2; } if(z1 <= r ) { r = r - z1; q = q + z2; } while (z2 != 1) { z1 = z1 / 2; z2 = z2 / 2; if(z1 <= r ) { r = r - z1; q = q + z2; } } printf("%d = %d * %d + %d\n", x, q, y, r); }
Iskoristimo sada činjenicu da je operacija šiftovanja (pomeranja) datog broja udesno za n mesta ekvivalentna celobrojnom deljenju sa n-tim stepenom dvojke, a operacija šiftovanja ulevo za n mesta ekvivalentna množenju tog broja sa n-tim stepenom dvojke, pri čemu su ove operacije efikasnije od pomenutih operacija množenja i deljenja sa stepenom dvojke.
Program možemo napisati koristeći samo operacije sabiranja, oduzimanja i šiftovanja ulevo i udesno na sledeći način:
#include<stdio.h> #include<stdlib.h> main() { unsigned int x, y, z1, z2; unsigned int q, r; printf("Unesite brojeve x i y za koje zelite da izracunate celobrojno deljenje:\n"); scanf("%d%d", &x, &y); if(y == 0) { printf("Greska pri unosu vrednosti y!\n"); exit(1); } q = 0; r = x; z1 = y; z2 = 1; while (z1 < r ) { z1 = z1 << 1; z2 = z2 << 1; } if(z1 <= r ) { r = r - z1; q = q + z2; } while (z2 != 1) { z1 = z1 >> 1; z2 = z2 >> 1; if(z1 <= r ) { r = r - z1; q = q + z2; } } printf("%d = %d * %d + %d\n", x, q, y, r); }Program možemo unaprediti korišćenjem operatora +=, -=, >>= i <<=.
#include<stdio.h> #include<stdlib.h> main() { unsigned int x, y, z1, z2; unsigned int q, r; printf("Unesite brojeve x i y za koje zelite da izracunate celobrojno deljenje:\n"); scanf("%d%d", &x, &y); if(y == 0) { printf("Greska pri unosu vrednosti y!\n"); exit(1); } q = 0; r = x; z1 = y; z2 = 1; while (z1 < r ) { z1 <<= 1; z2 <<= 1; } if(z1 <= r ) { r -= z1; q += z2; } while (z2 != 1) { z1 >>= 1; z2 >>= 1; if(z1 <= r ) { r -= z1; q += z2; } } printf("%d = %d * %d + %d\n", x, q, y, r); }Ovim smo došli do kraja razvojnog puta programa za hardverdsko celobrojno deljenje. Pri tome, znamo da se on uvek zaustavlja i da je korektan za sve vrednosti ulaznih parametra.
Naredna: Selection sort Gore: Hardverdsko celobrojno deljenje Prethodna: Dokaz zaustavljanja programa Sadržaj