On Friday, 8 August 2014 at 22:43:38 UTC, Andrei Alexandrescu wrote:
On 8/7/14, 12:40 PM, Era Scarecrow wrote:
As for being able to find x number of bits that are 0 or 1 in a row, that both sounds easy and hard at the same time (easy if you don't mind it being slow). In my rewrite there was a bulk template I created that was intended to do huge speedups with binary data (when the data was naturally aligned correctly and large enough to use the binary operators on normal types). Some of the unittests and example code also used them in a read-only fashion that could be specialized for finding a certain type of pattern...

A thought: if whatever work on bit arrays you do isn't fast, it's probably not worth doing; people who opt for that kind of packing are most often performance motivated.

Alignment is often not an issue - you handle the setup/teardown misalignments separately and to the bulk 64 bits at a time.

What kind of performance are you looking for? I have some very basic bit-manipulation code written in C++ that operates on whole words at a time, not sure if it's what you need but if it is then it should be trivial to port this to D:

template<class Diff, class It>
It setbits(It i, Diff j, Diff n)
{
        typedef typename std::iterator_traits<It>::value_type T;
        T ones = static_cast<T>(~T());
        Diff const bits = static_cast<Diff>(sizeof(*i) * CHAR_BIT);
        i += j / bits;
        j %= bits;
        if (j)
        {
                *i |= (ones << j) &
                        (ones >> max(0, static_cast<int>(bits - j - n)));
                ++i;
                n -= min(n, bits - j);
        }
        fill_ni, n / bits, ones);
        i += static_cast<ptrdiff_t>(n / bits);
        n %= bits;
        if (n)
        {
                *i |= ones >> max(0, static_cast<int>(bits - n));
                ++i;
        }
        return i;
}

Reply via email to