Go Down

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

virenbhanot

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:
http://www.zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/

I'd be grateful for any help

Thanks

Viren

WizenedEE

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

1 << i


This means take the number 1 (the first "1"):
Code: [Select]
00000001
then "shifting" it right i bits. So if i was 4, 1<<i would be
Code: [Select]
00010000
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 =
01011001


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!

virenbhanot

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.

power7net

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
     highpulse++;
     
Web / sms / bluetooth / arduino / android remote control. Home Automation projects.
http://www.power7.net

PaulS

Quote
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.

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!

Arduino
via Egeo 16
Torino, 10131
Italy