Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

To Toggle or Not to Toggle - xor is Your Friend

0.00/5 (No votes)
12 Jan 2013 1  
Short tip to show a convenient use of the lesser known xor operator

Introduction

I struggle once in a while over some complicated if-elseif-else constructs that have a more concise alternative: use of the xor operator (means: exclusive-or) that many languages provide.

This tip shows the use of xor on an example of a conditional toggle function. Such functions may be used in automated GUI tests where e.g. in a tree view a sub-tree has to be opened if it is not yet open, or has to be closed if it is open.

It is a trivial tip, but it seems that many people either don't know of it or it does not occur to them to use it.

Using the Code

Assuming you had to write the following function:

// sets the ToggleButton to the defined pressed state (true = pressed, false = not pressed).
void ClickIfNeeded(ToggleButton button, bool pressed)
{
   ...
}

The xor implementation provides in my view a cleaner implementation compared to the naive implementation:

Naive implementation xor based implementation
void ClickIfNeeded(ToggleButton button,
                   bool pressed)
{
   if (button.IsPressed)
   {
      if (!pressed)
      {
          button.Click();
      }
   }
   else
   {
      if (pressed)
      {
          button.Click();
      }
   }
}
void ClickIfNeeded(ToggleButton button,
                     bool pressed)
{
   // click the button if it has not yet
   // the requested pressed state
   if (button.IsPressed ^ pressed) button.Click();
}











The Exclusive-Or operator:

  • the xor operator has for C, C++, C#, etc. the following sign: ^
  • xor gives true if exactly one of the operands is true (hence: exclusive or)
  • xor gives false if both operands have the same value.

i.e. in the example above: only click the toggle button if it has not yet the requested pressed state.

History

V1.0 2013-01-12 Initial version

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here