Skip to content

yav/cbits

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

This library (work in progress) defines functions for working with arbitrary sized bit-vectors. The library has two sets of algorithms:

  • the "small" representation for sizes [1 .. 64] uses uint64_t
  • the "large" representation for sizes [65 .. ) uses an array of uint32_t

All functions in the library have an explicit parameter specifying the widths of the bit-vectors involved.

In addition, we plan to provide a 3rd representation, which is a union of "small" and "large", and the width argument will be used to choose between the alternatives of the union. Thus, the width is used as the "tag" of the corresponding algebraic datatype, but it is not stored directly with the value.

Bit-vectors that do not fit in a representation type exactly, are placed in the most significant bits of the representation, with the least significant unused bits set to 0. Essentially, if x is an N-bit vector (1 <= N <= 64), it will be represented as x * 2^(64-N) (aka x << (64-N)). The same holds for large bit-vectors, where the least significant element of the representation array may contain up to 31 bits of padding. This is useful, because it allows many operations to be performed directly on the normalized representation, without having to change representations.

For the large representation, the least significant bits of the value are in the first array element, and the most significant bits are in the last array element.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published