On Friday, 15 March 2024 at 00:21:42 UTC, H. S. Teoh wrote:
On Thu, Mar 14, 2024 at 11:39:33PM +0000, Liam McGillivray via
Digitalmars-d-learn wrote: [...]
I tried to rework the functions to use bitwise operations, but
it was difficult to figure out the correct logic. I decided
that it's not worth the hassle, so I just changed the value
storage from `bool[3]` to `ubyte`.
[...]
Just wanted to note that while in theory bool[3] could be
optimized by the compiler for compact storage, what you're most
likely to get is 3 bytes, one for each bool, or perhaps even 3
ints (24 bytes). When dealing with units of data smaller than a
byte, you generally need to do it manually, because memory is
not addressable by individual bits, making it difficult to
implement things like slicing an array of bool. So the compiler
is most likely to simplify things by making it an array of
bytes rather than emit complex bit manipulation code to make up
for the lack of bit-addressability in the underlying hardware.
Using bit operators like others have pointed out in this thread
is probably the best way to implement what you want.
T
I'm curious as to what "manual implementation" would mean, since
clearly making my own struct with `bool[3]` doesn't count. Does D
have features for precise memory manipulation?
Anyway, I'm surprised that D has a special operator `&=` for
doing bit manipulation on integers, especially given that the
steps to convert an int into a bool array is more complicated. I
would imagine the former would be a rather niche thing.