Go Down

Topic: Small help needed with #Define (Read 774 times) previous topic - next topic


Hi everyone,

I am really new to using Arduinos, less than a week in fact, so my query is rather basic. Can someone explain what the following command is likely to do:

"#define BIT_IS_SET(i, bits)  (1 << i & bits)"

This is the first line of code being used to make an IR remote control, found at the following link:

I'd be grateful for any help




"#define BIT_IS_SET(i, bits)  (1 << i & bits)"
Code: [Select]

1 << i

This means take the number 1 (the first "1"):
Code: [Select]
then "shifting" it right i bits. So if i was 4, 1<<i would be
Code: [Select]
See, the 1 is now 4 digits more to the left. This is exactly the same as saying
Code: [Select]
i * 16 // 16 is 2^4
The & is the bitwise AND. This means that it cycles through each bit in each byte, and if they are the same, it makes the corresponding resulting bit 1. Example:
Code: [Select]
01011001 &
11011101 =

Since 1<<i will be all zeros except for one digit, the answer will either have all 0's if that bit wasn't 1, or one 1 if the bit was one. Lucky for us, C interprets any value that's not 0 as "true" in an if-statement.

So, all in all, that define checks whether or not the "i"th bit of "bits" is 1.

Morris Dovey

If I add parentheses it'll be easier to understand:

Code: [Select]
#define BIT_IS_SET(i,bits) ((1 << i) & bits)

The macro shifts 1 left i positions and bitwise ands the result with the value bits. The result will be true if bit i of bits is set.

Note: a safer version of this macro would look like:

Code: [Select]
#define BIT_IS_SET(i,bits) ((1 << (i)) & (bits))

because it would be "better behaved" if either i or bits happened to be an expression.
There's always a better way!


Ah! I think I get it now.
In my hopeless confusion, I was thinking this #define was defining a variable called BIT_IS_SET. But, from what you say, this is almost a function right? Which returns true or false depending on the result of bitwise ANDing?

Just one more question, can I do something like 6<<i so that the binary number for 6 (0000011) becomes 00000110 (i.e. 12)?

Thanks a lot for your help though.


Hi.How work this?
Code: [Select]

#define IRpin_PIN      PIND
#define IRpin             2

//  while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
     // pin is still HIGH

     // count off another few microseconds
Web / sms / bluetooth / arduino / android remote control. Home Automation projects.


Just one more question, can I do something like 6<<i so that the binary number for 6 (0000011) becomes 00000110 (i.e. 12)?

If i is 1, yes.
The art of getting good answers lies in asking good questions.

Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131