Go Down

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


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!


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.


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


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


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!


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