Go Down

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

RogerW

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. 

Thanks in advance.

RWW

ilektron

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.
http://ilektron-x.blogspot.com - Hacking and General Electronics Goodness

robtillaart

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


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

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

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

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

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

In addition to PaulS remark,

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

Thanks for the further info.  I think i understand precedence now.

As for my assignment...

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

in order from top to bottom.  Correct?

Does MODULO refer to the remainder of a division calculation?

RWW

InvalidApple

Quote
Does MODULO refer to the remainder of a division calculation?


yes.

RogerW

Then modulo would fit between division and addition....  Correct?

RWW

InvalidApple

This is from "The Complete Reference: C++", Table 2-8 "The Precedence of C Operators"

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

InvalidApple

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

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