Re: деление на 6

From
Pertzel Family ()
To
Alexander Golovlev
Date
2002-09-07T12:47:27Z
Area
RU.ALGORITHMS
From: "Pertzel Family" <voldemar@relhum.org>


"Alexander Golovlev" > Pertzel!

> Хорошо, а как умножить на 1/6

То есть умножить на двоичное
0.00101010101010101010101010101010.....
Если в процессоре это не реализовано
аппаратно, то вот код на языке Це:

(не обратил внимания на слово "байт",
но все же допишу, может пригодится)

unsigned byte DivBy6 (unsigned byte X) {
  union {
    unsigned word a;
    unsigned byte b;
  } A,Z;
  A.a=0;
  A.b=X; /* старший бит A.a содержит X, младший -- 0*/
  Z.a=A.a=А.a>>3;
  Z.a+=A.a=A.a>>2
  Z.a+=A.a=A.a>>2
  Z.a+=A.a=A.a>>2
  return Z.b /* старший бит Z */;
}

====================================
А теперь -- самый быстрый алгоритм:
====================================
строим два const массива:
unsigned byte DivResult[256]={0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,3,...};
unsigned byte modResult[256]={0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3,4,5,0,...};

inline unsigned byte DivBy6 (unsigned byte X) {return DivResult[X]);
inline unsigned byte ModBy6 (unsigned byte X) {return ModResult[X]);




--- ifmail v.2.15dev5
 * Origin: Sent via Graf's Inn at news://news.relhum.org (2:5020/400)