Go Down

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

#### A._Square

##### Jan 21, 2008, 10:31 pm
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

#1
##### Jan 21, 2008, 10:36 pm
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

#2
##### Jan 21, 2008, 10:40 pm
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

#3
##### Jan 21, 2008, 10:42 pm
Nope, because, for example, 5 & (1 << 2) is 4, not 1.  Really, I should have used (val >> i) & 1 instead.

#### A._Square

#4
##### Jan 21, 2008, 10:45 pm
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

#5
##### Jan 22, 2008, 10:02 pm
or (val >> i) != 0

Go Up

Please enter a valid email to subscribe