Remove Data-dependencies
Are you planning to remove data-dependencies in your logic? You might find the below useful.
Statement Block |
Constant Time Equivalent |
x++; if(x >= MAX_SIZE) x = 0; |
x = ( x + 1 ) % MAX_SIZE; |
x--; if(x < 0) x = MAX_SIZE - 1; |
x = (x + MAX_SIZE – 1) % MAX_SIZE; |
x = x + increment; if(x >= MAX_SIZE) x = 0; |
x = (x + increment) % MAX_SIZE; |
x = x - decrement; if(x < 0) x = MAX_SIZE - 1; |
x = (x + MAX_SIZE – decrement) % MAX_SIZE; |
x = x + increment; if(x >=MAX_SIZE) x = UPPER_LIMIT; |
x = x + increment; x = (x * (!((x/MAX_SIZE)^0))) + (UPPER_LIMIT * (!!((x/MAX_SIZE)^0))); |
x = x - decrement; if(x < MIN_SIZE) x = LOWER_LIMIT; |
x = x - decrement; x = (LOWER_LIMIT * (!(x / MIN_SIZE)^0))) + (x * (!!(( x / MIN_SIZE)^0))); |
if(x % 2) x--; |
x &= ~0x01 ; |
if(x % 2) x++; |
x = (x & (~0x01)) + ((x - (x & (~0x01))) << 1) ; |
if(!(x % 2)) x++; |
x |= 0x01 ; |
if(!(x % 2)) x--; |
x = (x | 0x01) - ((x - (x | 0x01)) << 1) ; |
An example application is below.
#include<stdio.h>
#include<stdlib.h>
int (*lpfnCorrectError[2])(int);
int (*lpfnCorrect[2])(int);
int (*lpfnHandler[6])(int);
int Error(int);
int Correct(int);
int One(int);
int Two(int);
int Three(int);
int Four(int);
int Five(int);
int Quit(int);
int Switch(int);
int main(int argc, char *argv[])
{
char ch[2];
unsigned int num;
lpfnCorrectError[0]=Correct;
lpfnCorrectError[1]=Error;
lpfnCorrect[0]=Switch;
lpfnCorrect[1]=Error;
lpfnHandler[0]=Quit;
lpfnHandler[1]=One;
lpfnHandler[2]=Two;
lpfnHandler[3]=Three;
lpfnHandler[4]=Four;
lpfnHandler[5]=Five;
ReadInput:
fflush(stdin);
num=99;
printf("\nEnter Your Choice between [1..5] or 0 to Quit\t:");
scanf("%2d",&num);
(*lpfnCorrectError[num>>8*sizeof(unsigned int)-1])(num);
goto ReadInput;
return 0;
}
int Correct(int num)
{ //!((num/6)^0) returns 1 if num/6==0
return (*lpfnCorrect[!!((num/6)^0)])(num); //num/6==0?Switch():Error();
}
int Error(int num)
{
return fprintf(stderr,"\tInvalid Input: Please Enter a number between [1..5] or 0 to Quit",num);
}
int Switch(int num)
{
return (*lpfnHandler[num])(num);
}
int One(int num)
{
return printf("\n This is Place Holder for Function One\n");
}
int Two(int num)
{
return printf("\n This is Place Holder for Function Two\n");
}
int Three(int num)
{
return printf("\n This is Place Holder for Function Three\n");
}
int Four(int num)
{
return printf("\n This is Place Holder for Function Four\n");
}
int Five(int num)
{
return printf("\n This is Place Holder for Function Five\n");
}
int Quit(int num)
{
exit(fprintf(stderr,"\n Terminating.....\n"));
return 0;
}
/*****************************************************************/
/**** if(n==p) can be written as !(n^p) **************************/
/**** if(n>=p) can be written as !!((n/p)^0) *********************/
/*****************************************************************/
Comments
- Anonymous
January 04, 2008
PingBack from http://geeklectures.info/2008/01/04/remove-data-dependencies/