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)