Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- inline unsigned int isodd(unsigned int x) { return x & 1; }
- template <class T>
- inline T tempow( T m, T num) //template pow
- {
- T o=m;
- while(num>1){
- num--;
- o*=m;
- }
- return o;
- }
- //table of 10s up to 64bit uint
- static const unsigned int tabp10[]={ //1, 10, 100 ... 10^39
- 1,
- tempow((unsigned int)10,(unsigned int)1),
- tempow((unsigned int)10,(unsigned int)2),
- tempow((unsigned int)10,(unsigned int)3),
- tempow((unsigned int)10,(unsigned int)4),
- tempow((unsigned int)10,(unsigned int)5),
- tempow((unsigned int)10,(unsigned int)6),
- tempow((unsigned int)10,(unsigned int)7),
- tempow((unsigned int)10,(unsigned int)8),
- tempow((unsigned int)10,(unsigned int)9),
- tempow((unsigned int)10,(unsigned int)10),
- tempow((unsigned int)10,(unsigned int)11)
- };
- template <class T>
- inline T powt10(T num)
- {
- return tabp10[num];
- }
- unsigned int baseTwoDigits(unsigned int x) {
- return x ? 32 - __builtin_clz(x) : 0;
- }
- static unsigned int logt10(unsigned int x) {
- static const unsigned char guess[33] = {
- 0, 0, 0, 0, 1, 1, 1, 2, 2, 2,
- 3, 3, 3, 3, 4, 4, 4, 5, 5, 5,
- 6, 6, 6, 6, 7, 7, 7, 8, 8, 8,
- 9, 9, 9
- };
- unsigned int digits = guess[baseTwoDigits(x)];
- return digits + (x >= tabp10[digits]);
- }
- //double any substring of a number
- inline unsigned int brusselDouble(unsigned int n, unsigned int offsetLeft/*offset left*/, unsigned int length/*length*/){
- unsigned int tnum = n %powt10(offsetLeft+length) /powt10(offsetLeft); //parse target number
- unsigned int mag = powt10(logt10(tnum)); //compensate magnitude difference
- bool magDif = ((tnum<<1)>=mag);
- unsigned int tnum2 = tnum<<1; //double
- tnum2 *=powt10(offsetLeft); //trailing zeros
- unsigned int prefix= n/powt10(offsetLeft+length) * powt10(offsetLeft+length+magDif); //substring prefix
- unsigned int suffix = n%powt10(offsetLeft); //substring suffix
- unsigned int out = prefix+tnum2+suffix; //concatenate
- return out;
- }
- //divide any substring of a number
- inline unsigned int brusselDivide(unsigned int n, unsigned int offsetLeft, unsigned int length){
- unsigned int tnum = n%powt10(offsetLeft+length) /powt10(offsetLeft); //parse target number
- if(isodd(tnum)){return 0;}
- unsigned int mag = powt10((int8_t)logt10(tnum)-1); //compensate magnitude difference
- bool magDif = (tnum<(mag<<1));
- unsigned int prefix = n/powt10(offsetLeft+length) * powt10(offsetLeft+length-magDif); //substring prefix
- unsigned int suffix = n%powt10(offsetLeft); //substring suffix
- unsigned int tnum2 = tnum>>1; //halve
- tnum2 *=powt10(offsetLeft); //trailing zeros
- unsigned int out = prefix+tnum2+suffix; //concatenate
- return out;
- }
Advertisement
Advertisement