You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
13 KiB
HTML
253 lines
13 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Arduino - BitwiseAnd </title>
|
|
<link rel="shortcut icon" type="image/x-icon" href="http://arduino.cc/en/favicon.png">
|
|
<link rel='stylesheet' href='arduinoUno.css' type='text/css' />
|
|
<!--HeaderText--><style type='text/css'><!--
|
|
ul, ol, pre, dl, p { margin-top:0px; margin-bottom:0px; }
|
|
code { white-space: nowrap; }
|
|
.vspace { margin-top:1.33em; }
|
|
.indent { margin-left:40px; }
|
|
.outdent { margin-left:40px; text-indent:-40px; }
|
|
a.createlinktext { text-decoration:none; border-bottom:1px dotted gray; }
|
|
a.createlink { text-decoration:none; position:relative; top:-0.5em;
|
|
font-weight:bold; font-size:smaller; border-bottom:none; }
|
|
img { border:0px; }
|
|
|
|
span.anchor {
|
|
float: left;
|
|
font-size: 10px;
|
|
margin-left: -10px;
|
|
width: 10px;
|
|
position:relative; top:-0.1em;
|
|
text-align: center;
|
|
}
|
|
span.anchor a { text-decoration: none; }
|
|
span.anchor a:hover { text-decoration: underline; }
|
|
ol.toc { text-indent:-20px; list-style: none; }
|
|
ol.toc ol.toc { text-indent:-40px; }
|
|
div.tocfloat { font-size: smaller; margin-bottom: 10px;
|
|
border-top: 1px dotted #555555; border-bottom: 1px dotted #555555;
|
|
padding-top: 5px; padding-bottom: 5px;
|
|
width: 38%; float: right; margin-left: 10px; clear: right;
|
|
margin-right:-13px; padding-right: 13px; padding-left: 13px;
|
|
background-color: #eeeeee; }
|
|
div.toc { font-size: smaller;
|
|
padding: 5px; border: 1px dotted #cccccc;
|
|
background: #f7f7f7;
|
|
margin-bottom: 10px; }
|
|
div.toc p { background-color: #f9f6d6;
|
|
margin-top:-5px; padding-top: 5px;
|
|
margin-left:-5px; padding-left: 5px;
|
|
margin-right:-5px; padding-right: 5px;
|
|
padding-bottom: 3px;
|
|
border-bottom: 1px dotted #cccccc; }.editconflict { color:green;
|
|
font-style:italic; margin-top:1.33em; margin-bottom:1.33em; }
|
|
|
|
table.markup { border: 2px dotted #ccf; width:90%; }
|
|
td.markup1, td.markup2 { padding-left:10px; padding-right:10px; }
|
|
td.markup1 { border-bottom: 1px solid #ccf; }
|
|
div.faq { margin-left:2em; }
|
|
div.faq p.question { margin: 1em 0 0.75em -2em; font-weight:bold; }
|
|
div.faq hr { margin-left: -2em; }
|
|
|
|
.frame
|
|
{ border:1px solid #cccccc; padding:4px; background-color:#f9f9f9; }
|
|
.lfloat { float:left; margin-right:0.5em; }
|
|
.rfloat { float:right; margin-left:0.5em; }
|
|
a.varlink { text-decoration:none; }
|
|
|
|
--></style><script type="text/javascript">
|
|
function toggle(obj) {
|
|
var elstyle = document.getElementById(obj).style;
|
|
var text = document.getElementById(obj + "tog");
|
|
if (elstyle.display == 'none') {
|
|
elstyle.display = 'block';
|
|
text.innerHTML = "hide";
|
|
} else {
|
|
elstyle.display = 'none';
|
|
text.innerHTML = "show";
|
|
}
|
|
}
|
|
</script> <meta name='robots' content='index,follow' />
|
|
|
|
<meta name="verify-v1" content="TtxFIEJAB6zdJ509wLxjnapQzKAMNm9u0Wj4ho6wxIY=" />
|
|
</head>
|
|
<body>
|
|
<div id="page">
|
|
<!--PageHeaderFmt-->
|
|
<div id="pageheader">
|
|
<div class="title"><a href='http://arduino.cc/en'>Arduino</a></div>
|
|
<div class="search">
|
|
<!-- SiteSearch Google -->
|
|
<FORM method=GET action="http://www.google.com/search">
|
|
<input type=hidden name=ie value=UTF-8>
|
|
<input type=hidden name=oe value=UTF-8>
|
|
<INPUT TYPE=text name=q size=25 maxlength=255 value="">
|
|
<INPUT type=submit name=btnG VALUE="search">
|
|
<input type=hidden name=domains value="http://www.arduino.cc/">
|
|
<input type=hidden name=sitesearch value="http://www.arduino.cc/">
|
|
</FORM>
|
|
<!-- SiteSearch Google -->
|
|
</div>
|
|
</div>
|
|
<!--/PageHeaderFmt-->
|
|
<!--PageLeftFmt-->
|
|
<div id="pagenav">
|
|
<div id="navbar">
|
|
<p><a class='wikilink' href='http://arduino.cc/en/Main/Buy'>Buy</a>
|
|
<a class='wikilink' href='http://arduino.cc/en/Main/Software'>Download</a>
|
|
<a class='wikilink' href='Guide_index.html'>Getting Started</a>
|
|
<a class='wikilink' href='http://arduino.cc/en/Tutorial/HomePage'>Learning</a>
|
|
<a class='wikilink' href='index.html'>Reference</a>
|
|
<a class='wikilink' href='http://arduino.cc/en/Main/Hardware'>Hardware</a>
|
|
<a class='wikilink' href='FAQ.html'>FAQ</a>
|
|
</p>
|
|
<p class='vspace'></p>
|
|
|
|
</div>
|
|
<div id="navbar_external">
|
|
<a class="urllink" href="http://www.arduino.cc/blog/" rel="nofollow">Blog »</a><a class="urllink" href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl" rel="nofollow">Forum »</a><a class="urllink" href="http://www.arduino.cc/playground/" rel="nofollow">Playground »</a>
|
|
</div>
|
|
</div>
|
|
<!--/PageLeftFmt-->
|
|
<div id="pagetext">
|
|
<!--PageText-->
|
|
<div id='wikitext'>
|
|
<p><strong>Reference</strong> <a class='wikilink' href='index.html'>Language</a> | <a class='wikilink' href='Libraries.html'>Libraries</a> | <a class='wikilink' href='Comparison.html'>Comparison</a> | <a class='wikilink' href='Changes.html'>Changes</a>
|
|
</p>
|
|
<p class='vspace'></p><h2>Bitwise AND (&), Bitwise OR (|), Bitwise XOR (^)</h2>
|
|
<h4>Bitwise AND (&)</h4>
|
|
<p>The bitwise operators perform their calculations at the bit level of variables. They help solve a wide range of common programming problems. Much of the material below is from an excellent tutorial on bitwise math wihch may be found <a class='urllink' href='http://www.arduino.cc/playground/Code/BitMath' rel='nofollow'>here.</a>
|
|
</p>
|
|
<p class='vspace'></p><h4>Description and Syntax</h4>
|
|
<p>Below are descriptions and syntax for all of the operators. Further details may be found in the referenced tutorial.
|
|
</p>
|
|
<p class='vspace'></p><h4>Bitwise AND (&)</h4>
|
|
<p>The bitwise AND operator in C++ is a single ampersand, &, used between two other integer expressions. Bitwise AND operates on each bit position of the surrounding expressions independently, according to this rule: if both input bits are 1, the resulting output is 1, otherwise the output is 0. Another way of expressing this is:
|
|
</p>
|
|
<p class='vspace'></p><pre> 0 0 1 1 operand1
|
|
0 1 0 1 operand2
|
|
----------
|
|
0 0 0 1 (operand1 & operand2) - returned result
|
|
</pre>
|
|
<p class='vspace'></p><p>In Arduino, the type int is a 16-bit value, so using & between two int expressions causes 16 simultaneous AND operations to occur. In a code fragment like:
|
|
</p>
|
|
<p class='vspace'></p><pre> int a = 92; // in binary: 0000000001011100
|
|
int b = 101; // in binary: 0000000001100101
|
|
int c = a & b; // result: 0000000001000100, or 68 in decimal.
|
|
</pre>
|
|
<p class='vspace'></p><p>Each of the 16 bits in a and b are processed by using the bitwise AND, and all 16 resulting bits are stored in c, resulting in the value 01000100 in binary, which is 68 in decimal.
|
|
</p>
|
|
<p class='vspace'></p><p>One of the most common uses of bitwise AND is to select a particular bit (or bits) from an integer value, often called masking. See below for an example
|
|
</p>
|
|
<p class='vspace'></p><h4>Bitwise OR (|)</h4>
|
|
<p>The bitwise OR operator in C++ is the vertical bar symbol, |. Like the & operator, | operates independently each bit in its two surrounding integer expressions, but what it does is different (of course). The bitwise OR of two bits is 1 if either or both of the input bits is 1, otherwise it is 0. In other words:
|
|
</p>
|
|
<p class='vspace'></p><pre> 0 0 1 1 operand1
|
|
0 1 0 1 operand2
|
|
----------
|
|
0 1 1 1 (operand1 | operand2) - returned result
|
|
</pre>
|
|
<p class='vspace'></p><p>Here is an example of the bitwise OR used in a snippet of C++ code:
|
|
</p>
|
|
<p class='vspace'></p><pre> int a = 92; // in binary: 0000000001011100
|
|
int b = 101; // in binary: 0000000001100101
|
|
int c = a | b; // result: 0000000001111101, or 125 in decimal.
|
|
</pre>
|
|
<p class='vspace'></p><h4>Example Program</h4>
|
|
<p>A common job for the bitwise AND and OR operators is what programmers call Read-Modify-Write on a port. On microcontrollers, a port is an 8 bit number that represents something about the condition of the pins. Writing to a port controls all of the pins at once.
|
|
</p>
|
|
<p class='vspace'></p><p>PORTD is a built-in constant that refers to the output states of digital pins 0,1,2,3,4,5,6,7. If there is 1 in an bit position, then that pin is HIGH. (The pins already need to be set to outputs with the pinMode() command.) So if we write <code>PORTD = B00110001;</code> we have made pins 2,3 & 7 HIGH.
|
|
One slight hitch here is that we <em>may</em> also have changeed the state of Pins 0 & 1, which are used by the Arduino for serial communications so we may have interfered with serial communication.
|
|
</p>
|
|
<p class='vspace'></p><pre> Our algorithm for the program is:
|
|
</pre><ul><li>Get PORTD and clear out only the bits corresponding to the pins we wish to control (with bitwise AND).
|
|
</li><li>Combine the modified PORTD value with the new value for the pins under control (with biwise OR).
|
|
</li></ul><p class='vspace'></p><pre>int i; // counter variable
|
|
int j;
|
|
|
|
void setup(){
|
|
DDRD = DDRD | B11111100; // set direction bits for pins 2 to 7, leave 0 and 1 untouched (xx | 00 == xx)
|
|
// same as pinMode(pin, OUTPUT) for pins 2 to 7
|
|
Serial.begin(9600);
|
|
}
|
|
|
|
void loop(){
|
|
for (i=0; i<64; i++){
|
|
|
|
PORTD = PORTD & B00000011; // clear out bits 2 - 7, leave pins 0 and 1 untouched (xx & 11 == xx)
|
|
j = (i << 2); // shift variable up to pins 2 - 7 - to avoid pins 0 and 1
|
|
PORTD = PORTD | j; // combine the port information with the new information for LED pins
|
|
Serial.println(PORTD, BIN); // debug to show masking
|
|
delay(100);
|
|
}
|
|
}
|
|
</pre>
|
|
<p class='vspace'></p><h4>Bitwise XOR (^)</h4>
|
|
<p>There is a somewhat unusual operator in C++ called bitwise EXCLUSIVE OR, also known as bitwise XOR. (In English this is usually pronounced "eks-or".) The bitwise XOR operator is written using the caret symbol ^. This operator is very similar to the bitwise OR operator |, only it evaluates to 0 for a given bit position when both of the input bits for that position are 1:
|
|
</p>
|
|
<p class='vspace'></p><pre> 0 0 1 1 operand1
|
|
0 1 0 1 operand2
|
|
----------
|
|
0 1 1 0 (operand1 ^ operand2) - returned result
|
|
</pre>
|
|
<p class='vspace'></p><p>Another way to look at bitwise XOR is that each bit in the result is a 1 if the input bits are different, or 0 if they are the same.
|
|
</p>
|
|
<p class='vspace'></p><p>Here is a simple code example:
|
|
</p>
|
|
<p class='vspace'></p><pre> int x = 12; // binary: 1100
|
|
int y = 10; // binary: 1010
|
|
int z = x ^ y; // binary: 0110, or decimal 6
|
|
</pre>
|
|
<p class='vspace'></p><p>The ^ operator is often used to toggle (i.e. change from 0 to 1, or 1 to 0) some of the bits in an integer expression. In a bitwise OR operation if there is a 1 in the mask bit, that bit is inverted; if there is a 0, the bit is not inverted and stays the same. Below is a program to blink digital pin 5.
|
|
</p>
|
|
<p class='vspace'></p><pre>
|
|
// Blink_Pin_5
|
|
// demo for Exclusive OR
|
|
void setup(){
|
|
DDRD = DDRD | B00100000; // set digital pin five as OUTPUT
|
|
Serial.begin(9600);
|
|
}
|
|
|
|
void loop(){
|
|
PORTD = PORTD ^ B00100000; // invert bit 5 (digital pin 5), leave others untouched
|
|
delay(100);
|
|
}
|
|
</pre>
|
|
<p class='vspace'></p><p>See Also
|
|
</p><ul><li><a class='wikilink' href='Boolean.html'>&&</a>(Boolean AND)
|
|
</li><li><a class='wikilink' href='Boolean.html'>||</a>(Boolean OR)
|
|
</li></ul><p class='vspace'></p><p><a class='wikilink' href='index.html'>Reference Home</a>
|
|
</p>
|
|
<p class='vspace'></p><p><em>Corrections, suggestions, and new documentation should be posted to the <a class='urllink' href='http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?board=swbugs' rel='nofollow'>Forum</a>.</em>
|
|
</p>
|
|
<p class='vspace'></p><p>The text of the Arduino reference is licensed under a
|
|
<a class='urllink' href='http://creativecommons.org/licenses/by-sa/3.0/' rel='nofollow'>Creative Commons Attribution-ShareAlike 3.0 License</a>. Code samples in the reference are released into the public domain.
|
|
</p>
|
|
</div>
|
|
|
|
|
|
<!-- AddThis Button BEGIN -->
|
|
<script type="text/javascript">var addthis_language = "en";
|
|
</script>
|
|
<div class="addthis_container addthis_toolbox addthis_default_style" addthis:url="BitwiseAnd" addthis:title="Arduino Wiki English">
|
|
<a href="http://www.addthis.com/bookmark.php?v=250&username=arduinoteam" class="addthis_button_compact">Share</a><span
|
|
class="addthis_separator">|</span><a class="addthis_button_email"></a><a class="addthis_button_favorites"></a><a class="addthis_button_print"></a><a
|
|
class="addthis_button_facebook"></a><a class="addthis_button_twitter"></a><script type="text/javascript"
|
|
src="http://s7.addthis.com/js/250/addthis_widget.js#username=arduinoteam"></script></div>
|
|
<!-- AddThis Button END -->
|
|
|
|
</div>
|
|
<!--PageFooterFmt-->
|
|
<div id="pagefooter">
|
|
©Arduino |
|
|
<a href=.html'#'>Edit Page</a> | <a href='#'>Page History</a> | <a href='#' target='_blank'>Printable View</a> | <a href='http://arduino.cc/en/Site/AllRecentChanges'>All Recent Site Changes</a>
|
|
</div>
|
|
<!--/PageFooterFmt-->
|
|
</div>
|
|
</body>
|
|
</html>
|