this post was submitted on 15 May 2025
0 points (NaN% liked)

Programmer Humor

24628 readers
560 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 2 years ago
MODERATORS
 
top 26 comments
sorted by: hot top controversial new old
[–] [email protected] 0 points 1 month ago (2 children)

Back in the day when it mattered, we did it like

#define BV00		(1 <<  0)
#define BV01		(1 <<  1)
#define BV02		(1 <<  2)
#define BV03		(1 <<  3)
...etc

#define IS_SET(flag, bit)	((flag) & (bit))
#define SET_BIT(var, bit)	((var) |= (bit))
#define REMOVE_BIT(var, bit)	((var) &= ~(bit))
#define TOGGLE_BIT(var, bit)	((var) ^= (bit))

....then...
#define MY_FIRST_BOOLEAN BV00
SET_BIT(myFlags, MY_FIRST_BOOLEAN)

[–] [email protected] 0 points 1 month ago (2 children)

Okay. Gen z programmer here. Can you explain this black magic? I see it all the time in kernel code but I have no idea what it means.

[–] [email protected] 0 points 1 month ago* (last edited 1 month ago)

The code is a set of preprocessor macros to stuff loads of booleans into one int (or similar), in this case named 'myFlags'. The preprocessor is a simple (some argue too simple) step at the start of compilation that modifies the source code on its way to the real compiler by substituting #defines, prepending #include'd files, etc.

If myFlags is equal to, e.g. 67, that's 01000011, meaning that BV00, BV01, and BV07 are all TRUE and the others are FALSE.

The first part is just for convenience and readability. BV00 represents the 0th bit, BV01 is the first etc. (1 << 3) means 00000001, bit shifted left three times so it becomes 00001000 (aka 8).

The middle chunk defines macros to make bit operations more human-readable.

SET_BIT(myFlags, MY_FIRST_BOOLEAN) gets turned into ((myFlags) |= ((1 << 0))) , which could be simplified as myFlags = myFlags | 00000001 . (Ignore the flood of parentheses, they're there for safety due to the loaded shotgun nature of the preprocessor.)

[–] [email protected] 0 points 1 month ago* (last edited 1 month ago)

It's called bitshifting and is used to select which bits you want to modify so you can toggle them individually.

1 << 0 is the flag for the first bit
1 << 1 for the second
1 << 2 for the third and so on

I think that's correct. It's been years since I've used this technique tbh 😅

[–] [email protected] 0 points 1 month ago

With embedded stuff its still done like that. And if you go from the arduino functionss to writing the registers directly its a hell of a lot faster.

[–] [email protected] 0 points 1 month ago (1 children)

Wait till you find out about alignment and padding

[–] [email protected] 0 points 1 month ago

Tell me the truth, i can handle it

[–] [email protected] 0 points 1 month ago (1 children)

I set all 8 bits to 1 because I want it to be really true.

[–] [email protected] 0 points 1 month ago* (last edited 1 month ago) (4 children)

01111111 = true

11111111 = negative true = false

[–] [email protected] 0 points 1 month ago

Could also store our bools as floats.

00111111100000000000000000000000 is true and 10111111100000000000000000000000 is negative true.

Has the fun twist that true & false is true and true | false is false .

[–] [email protected] 0 points 1 month ago (1 children)

So all this time true was actually false and false was actually true ?

[–] [email protected] 0 points 1 month ago (1 children)

Depends on if you are on a big endian or little endian architecture.

[–] [email protected] 0 points 1 month ago

Come on man, I’m not gonna talk about my endian publicly

[–] [email protected] 0 points 1 month ago (2 children)
[–] [email protected] 0 points 1 month ago (1 children)
[–] [email protected] 0 points 1 month ago

0011 1111 = could you repeat the question

[–] [email protected] 0 points 1 month ago

Schrödingers Boolean

[–] [email protected] 0 points 1 month ago

Why do alternative facts always gotta show up uninvited to the party? 🥳

[–] [email protected] 0 points 1 month ago (1 children)
[–] [email protected] 0 points 1 month ago (1 children)

And compiler. And hardware architecture. And optimization flags.

As usual, it's some developer that knows little enough to think the walls they see around enclose the entire world.

[–] [email protected] 0 points 1 month ago (1 children)

I don't think so. Apart from dynamically typed languages which need to store the type with the value, it's always 1 byte, and that doesn't depend on architecture (excluding ancient or exotic architectures) or optimisation flags.

Which language/architecture/flags would not store a bool in 1 byte?

[–] [email protected] 0 points 1 month ago (1 children)

things that store it as word size for alignment purposes (most common afaik), things that pack multiple books into one byte (normally only things like bool sequences/structs), etc

[–] [email protected] 0 points 1 month ago (1 children)

things that store it as word size for alignment purposes

Nope. bools only need to be naturally aligned, so 1 byte.

If you do

struct SomeBools {
  bool a;
  bool b;
  bool c;
  bool d;
};

its 4 bytes.

[–] [email protected] 0 points 1 month ago (1 children)

sure, but if you have a single bool in a stack frame it's probably going to be more than a byte. on the heap definitely more than a byte

[–] [email protected] 0 points 1 month ago (1 children)

but if you have a single bool in a stack frame it’s probably going to be more than a byte.

Nope. - if you can't read RISC-V assembly, look at these lines

        sb      a5,-17(s0)
...
        sb      a5,-18(s0)
...
        sb      a5,-19(s0)
...

That is it storing the bools in single bytes. Also I only used RISC-V because I'm way more familiar with it than x86, but it will do the same thing.

on the heap definitely more than a byte

Nope, you can happily malloc(1) and store a bool in it, or malloc(4) and store 4 bools in it. A bool is 1 byte. Consider this a TIL moment.

[–] [email protected] 0 points 1 month ago

c++ guarantees that calls to malloc are aligned https://en.cppreference.com/w/cpp/memory/c/malloc .

you can call malloc(1) ofc, but calling malloc_usable_size(malloc(1)) is giving me 24, so it at least allocated 24 bytes for my 1, plus any tracking overhead

yeah, as I said, in a stack frame. not surprised a compiler packed them into single bytes in the same frame (but I wouldn't be that surprised the other way either), but the system v abi guarantees at least 4 byte alignment of a stack frame on entering a fn, so if you stored a single bool it'll get 3+ extra bytes added on the next fn call.

computers align things. you normally don't have to think about it. Consider this a TIL moment.