Markstar
Markstar

Reputation: 873

Using part of a variable as bool

Let's say memory is precious, and I have a class with a uint32_t member variable ui and I know that the values will stay below 1 million. The class also hase some bool members.

  1. Does it make sense to use the highest (highest 2,3,..) bit(s) of ui in order to save memory, since bool is 1 byte?

  2. If it does make sense, what is the most efficient way to get the highest (leftmost?) bit (or 2nd)? I read a few old threads and there seems to be disagreement about using inline ASM or some sort of shift.

Upvotes: 0

Views: 94

Answers (2)

Vlad Feinstein
Vlad Feinstein

Reputation: 11321

Well, if the memory is in fact precious, you should look deeper.

1,000,000 uses only 20 bits. This is less that 3 bytes. So you can allocate 3 bytes to keep your value and up to four booleans. Obviously, access will be a bit more complicated, but you save 25% of memory!

If you know that the values are below 524,287, for example, you can save another 15% by packing it (with bool) into 20 bits :)

Also, keeping bool in a separate array (as you said in a comment) would kill performance if you need to access the value and a corresponding bool simultaneously because they are far apart and will likely never be in a cache.

Upvotes: 1

Mamuka Sakhelashvili
Mamuka Sakhelashvili

Reputation: 168

It's a bit dangerous to use part of the bits as bool. The thing is that the way the numbers are kept in binary, makes it harder to maintain that keeping mechanism correct.

Negative numbers are kept as a complement of positive. Check this for more explanation. You may assign number to be 10 and then setting bool bit from false to true, and the number may turn out to become huge negative number as a result.

As for getting if n-th bit is 0 or 1 you can use this, where 0-th bit is the right most:

int nth_bit(int a, int n){
    return a & (1 << n);
}

It will return 0 or 1 identifying the n-th bit.

Upvotes: 1

Related Questions