Go Down

Topic: shiftOut code and double not (!!)? (Read 1 time) previous topic - next topic

A._Square

This question is for mellis more than anyone, but I figured I might as well post it publicly in case someone else might find it useful.

I've been going through the code that defines all the built-in functions to make sure I understand what's going on, and I noticed this in shiftOut:

Code: [Select]
digitalWrite(dataPin, !!(val & (1 << i)));

I'm wondering what the double exclamation is for; doesn't applying the NOT operator twice just leave the input unchanged? When I wrote my own version of a shiftOut function without them, it seemed to work fine; in the ShiftOut tutorial they don't have them.

Any insight? Thanks!


mellis

It's not very good style, and probably not necessary, but it converts anything besides 0 to 1, just in case digitalWrite() only accepted 1 for HIGH.  That is, !!5 is 1, and !!0 is 0.

A._Square

I see, and I see how that could be a useful trick. However, doesn't the & operator already guarantee that the result will be only 0 or 1? (I guess you did say it was probably not necessary, I'm just trying to figure out if there's any possibility it would be necessary.)

mellis

Nope, because, for example, 5 & (1 << 2) is 4, not 1.  Really, I should have used (val >> i) & 1 instead.

A._Square

Quote
Nope, because, for example, 5 & (1 << 2) is 4, not 1.  Really, I should have used (val >> i) & 1 instead.


I see. That's great! Thanks for the explanation!

anaidioschrono


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