Go Down

### Topic: bitwise problem (Read 1 time)previous topic - next topic

#### RogerW

##### Aug 25, 2011, 04:41 pm
I am working on a nixie clock.  In 12 hour mode I want to blank the leading zero.

This code does not work:
Code: [Select]
` if  (hours & 0b00010000 == 0)  // check to see if the hours = 10, 11, or 12  {    hoursOut = hours | leadzeroblank;      //if it is not 10, 11, or 12 blank the leading zero  }  else   {    hoursOut = hours;    // Serial.println(hours,BIN);  }`

and this code does work:
Code: [Select]
`  byte tens = hours & 0b00010000;    // mask the least sig byte of the 10's data  if  (tens == 0)  // check to see if the hours = 10, 11, or 12  {    hoursOut = hours | leadzeroblank;      //if it is not 10, 11, or 12 blank the leading zero  }  else   {    hoursOut = hours;  }`

Anyone have any idea why the first set of code does not give me the desired result?
What I am trying to do is check for the MSB of my hours data being equal to 1 as in 10, 11, or 12 o'clock.
If it is not then I send a code to my nixie driver that it can not understand and it blanks the digit.

First code does not work and the second set does.  There is something wrong with the IF statement.
and I do not know what is wrong.

RWW

#### ilektron

#1
##### Aug 25, 2011, 04:50 pm
Try this.  It might work.
Code: [Select]
`if  ((hours & 0b00010000) == 0)  // check to see if the hours = 10, 11, or 12  {    hoursOut = hours | leadzeroblank;      //if it is not 10, 11, or 12 blank the leading zero  }  else   {    hoursOut = hours;    // Serial.println(hours,BIN);  }`

I can't remember the precedence off the top of my head, but & and == are both operators like + or *.  You need to check precedence.

#### robtillaart

#2
##### Aug 25, 2011, 06:06 pm
Quote
Anyone have any idea why the first set of code does not give me the desired result?

What is the datatype of hours?
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

#### wildbill

#3
##### Aug 25, 2011, 06:31 pm

What is the datatype of hours?

BCD I assume, from the bitwise and and the comments. And if so, it is indeed a precedence issue, as suggested above

#### robtillaart

#4
##### Aug 25, 2011, 06:57 pm
It is used as BCD from the logic but the datatype can be byte, int, char unsigned etc.
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

#### Grumpy_Mike

#5
##### Aug 25, 2011, 07:18 pm
Quote
Try this.  It might work.

Yes ilektron, spot on this will work.
It is a trap that is common I sometimes succumb to it myself.

#### RogerW

#6
##### Aug 25, 2011, 09:36 pm
I made the change in the code suggested by ilektron.  The code does indeed now work as I
envisioned.  Thank you!!!!

Now can someone please help me understand  what is meant by the term precedence used in this discussion.

RWW

#### PaulS

#7
##### Aug 25, 2011, 09:40 pm
Quote
what is meant by the term precedence used in this discussion.

Precedence == order of evaluation.
Multiplication and division have higher precedence than addition and subtraction, so you can write:
int y = 7 * 4 + 9;
and know that the 7 * 4 will be performed, and then 9 will be added, as opposed to 4 and 9 being added, then multiplied by 4.

Your assignment now is to find the where modulo (%), logical and (&) and logical or (|) fit with respect to multiplication/division and addition/subtraction.

#### robtillaart

#8
##### Aug 25, 2011, 09:46 pm

int y = 9 + 7 * 4;

will be evaluated the same way as multiplication will come first.

Enforcing evaluation can be done with () which may cause a bit more typing but at least you get what you want

details see - http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence -
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

#### RogerW

#9
##### Aug 26, 2011, 12:53 am
Thanks for the further info.  I think i understand precedence now.

As for my assignment...

multiplication       *
division                 /
subtraction           -
Bitwise AND          &
Bitwise  OR            |

in order from top to bottom.  Correct?

Does MODULO refer to the remainder of a division calculation?

RWW

#### InvalidApple

#10
##### Aug 26, 2011, 01:15 am
Quote
Does MODULO refer to the remainder of a division calculation?

yes.

#### RogerW

#11
##### Aug 26, 2011, 01:24 am
Then modulo would fit between division and addition....  Correct?

RWW

#### InvalidApple

#12
##### Aug 26, 2011, 01:31 am
This is from "The Complete Reference: C++", Table 2-8 "The Precedence of C Operators"

Highest:
()[]->
!~++--(type)*&sizeof
*/%
+-
<<>>
< <= > >=
== =!
&^
|
&&
||
Highest:
?:
= += -= *= /= etc.
Lowest:
,

#### InvalidApple

#13
##### Aug 26, 2011, 01:36 am
I usually just use () for readability; even if they are not needed.

i.e.
if( a+b <= MAGIC_NUMBER/2) ...

I would type...
if( (a + b) <= (MAGIC_NUMBER / 2) )...

#### RoyK

#14
##### Aug 26, 2011, 02:37 am
I always use parentheses for things like this. I'd rather spend a couple of seconds making absolutely sure evaluations go the way I intend than hours trying to figure out what went wrong. Bitter experience speaking here.

Go Up