| On bit-splitting - libzahl - big integer library | |
| git clone git://git.suckless.org/libzahl | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 12c7344ec6770c692094456bc81e7ed4322552aa | |
| parent bc8390c7615cf9a466420aa05130322488d54d7b | |
| Author: Mattias Andrée <[email protected]> | |
| Date: Sat, 14 May 2016 20:51:30 +0200 | |
| On bit-splitting | |
| Signed-off-by: Mattias Andrée <[email protected]> | |
| Diffstat: | |
| M doc/bit-operations.tex | 46 +++++++++++++++++++++++++++++… | |
| 1 file changed, 45 insertions(+), 1 deletion(-) | |
| --- | |
| diff --git a/doc/bit-operations.tex b/doc/bit-operations.tex | |
| @@ -110,7 +110,51 @@ $r = \phantom{10001}1000_2$ after calling | |
| \section{Split} | |
| \label{sec:Split} | |
| -TODO % zsplit | |
| +In \secref{sec:Shift} and \secref{sec:Truncation} | |
| +we have seen how bit operations can be used to | |
| +calculate division by a power of two and | |
| +modulus a power of two efficiently using | |
| +bit-shift and bit-truncation operations. libzahl | |
| +also has a bit-split operation that can be used | |
| +to efficently calculate both division and | |
| +modulus a power of two efficiently in the same | |
| +operation, or equivalently, storing low bits | |
| +in one integer and high bits in another integer. | |
| +This function is | |
| + | |
| +\begin{alltt} | |
| + void zsplit(z_t high, z_t low, z_t a, size_t b); | |
| +\end{alltt} | |
| + | |
| +\noindent | |
| +Unlike {\tt zdivmod}, it is not more efficient | |
| +than calling {\tt zrsh} and {\tt ztrunc}, but | |
| +it is more convenient. {\tt zsplit} requires | |
| +that {\tt high} and {\tt low} are from each | |
| +other distinct references. | |
| + | |
| +Calling {\tt zsplit(high, low, a, b)} is | |
| +equivalent to | |
| + | |
| +\begin{alltt} | |
| + ztrunc(low, a, delim); | |
| + zrsh(high, a, delim); | |
| +\end{alltt} | |
| + | |
| +\noindent | |
| +assuming {\tt a} and {\tt low} are not the | |
| +same reference (reverse the order of the | |
| +functions if they are the same reference.) | |
| + | |
| +{\tt zsplit} copies the lowest {\tt b} bits | |
| +of {\tt a} to {\tt low}, and the rest of the | |
| +bits to {\tt high}, with the lowest {\tt b} | |
| +removesd. For example, if $a = 1010101111_2$, | |
| +then $high = 101010_2$ and $low = 1111_2$ | |
| +after calling {\tt zsplit(high, low, a, 4)}. | |
| + | |
| +{\tt zsplit} is especially useful in | |
| +divide-and-conquer algorithms. | |
| \newpage |