Advertisement
Kaelygon

32baseten.h

Jun 24th, 2023 (edited)
716
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1.  
  2. inline unsigned int isodd(unsigned int x) { return x & 1; }
  3.  
  4. template <class T>
  5. inline T tempow( T m, T num) //template pow
  6. {
  7.     T o=m;
  8.  
  9.     while(num>1){
  10.         num--;
  11.         o*=m;
  12.     }
  13.     return o;
  14. }
  15.  
  16. //table of 10s up to 64bit uint
  17. static const unsigned int tabp10[]={ //1, 10, 100 ... 10^39
  18.     1
  19.     tempow((unsigned int)10,(unsigned int)1),  
  20.     tempow((unsigned int)10,(unsigned int)2),  
  21.     tempow((unsigned int)10,(unsigned int)3),  
  22.     tempow((unsigned int)10,(unsigned int)4),  
  23.     tempow((unsigned int)10,(unsigned int)5),  
  24.     tempow((unsigned int)10,(unsigned int)6),  
  25.     tempow((unsigned int)10,(unsigned int)7),  
  26.     tempow((unsigned int)10,(unsigned int)8),  
  27.     tempow((unsigned int)10,(unsigned int)9),  
  28.     tempow((unsigned int)10,(unsigned int)10)
  29.     tempow((unsigned int)10,(unsigned int)11)
  30. };
  31.  
  32. template <class T>
  33. inline T powt10(T num)
  34. {
  35.     return tabp10[num];
  36. }
  37.  
  38. unsigned int baseTwoDigits(unsigned int x) {
  39.     return x ? 32 - __builtin_clz(x) : 0;
  40. }
  41.  
  42. static unsigned int logt10(unsigned int x) {
  43.     static const unsigned char guess[33] = {
  44.         0, 0, 0, 0, 1, 1, 1, 2, 2, 2,
  45.         3, 3, 3, 3, 4, 4, 4, 5, 5, 5,
  46.         6, 6, 6, 6, 7, 7, 7, 8, 8, 8,
  47.         9, 9, 9
  48.     };
  49.     unsigned int digits = guess[baseTwoDigits(x)];
  50.     return digits + (x >= tabp10[digits]);
  51. }
  52.  
  53. //double any substring of a number
  54. inline unsigned int brusselDouble(unsigned int n, unsigned int offsetLeft/*offset left*/, unsigned int length/*length*/){
  55.     unsigned int tnum  = n %powt10(offsetLeft+length) /powt10(offsetLeft);          //parse target number
  56.    
  57.     unsigned int mag = powt10(logt10(tnum));    //compensate magnitude difference
  58.     bool magDif = ((tnum<<1)>=mag);    
  59.  
  60.     unsigned int tnum2 = tnum<<1;               //double
  61.     tnum2 *=powt10(offsetLeft);                 //trailing zeros   
  62.  
  63.     unsigned int prefix=  n/powt10(offsetLeft+length) * powt10(offsetLeft+length+magDif);   //substring prefix
  64.     unsigned int suffix = n%powt10(offsetLeft);                                             //substring suffix
  65.  
  66.     unsigned int out = prefix+tnum2+suffix;     //concatenate
  67.  
  68.     return out;
  69. }
  70.  
  71. //divide any substring of a number
  72. inline unsigned int brusselDivide(unsigned int n, unsigned int offsetLeft, unsigned int length){
  73.     unsigned int tnum  = n%powt10(offsetLeft+length) /powt10(offsetLeft);           //parse target number
  74.     if(isodd(tnum)){return 0;}
  75.  
  76.     unsigned int mag = powt10((int8_t)logt10(tnum)-1);  //compensate magnitude difference
  77.     bool magDif = (tnum<(mag<<1)); 
  78.  
  79.     unsigned int prefix = n/powt10(offsetLeft+length) * powt10(offsetLeft+length-magDif);   //substring prefix
  80.     unsigned int suffix = n%powt10(offsetLeft);                                             //substring suffix
  81.     unsigned int tnum2 = tnum>>1;               //halve
  82.  
  83.     tnum2 *=powt10(offsetLeft);                 //trailing zeros
  84.  
  85.     unsigned int out = prefix+tnum2+suffix;     //concatenate
  86.  
  87.     return out;
  88. }
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement