这里会显示出您选择的修订版和当前版本之间的差别。
前一修订版 | |||
— | en:reference:language:bitwiseand [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== Bitwise AND (&), Bitwise OR (|), Bitwise XOR (^) ====== | ||
+ | |||
+ | |||
+ | ===== Bitwise AND (&) ===== | ||
+ | |||
+ | 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 here. | ||
+ | ===== Description and Syntax ===== | ||
+ | |||
+ | Below are descriptions and syntax for all of the operators. Further details may be found in the referenced tutorial. | ||
+ | ===== Bitwise AND (&) ===== | ||
+ | |||
+ | 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, | ||
+ | <code cpp> | ||
+ | 0 0 1 1 operand1 | ||
+ | 0 1 0 1 operand2 | ||
+ | ---------- | ||
+ | 0 0 0 1 (operand1 & operand2) - returned result | ||
+ | </ | ||
+ | In Ocrobot, 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: | ||
+ | <code cpp> | ||
+ | int a = 92; // in binary: 0000000001011100 | ||
+ | int b = 101; // in binary: 0000000001100101 | ||
+ | int c = a & b; // result: | ||
+ | </ | ||
+ | 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. | ||
+ | |||
+ | |||
+ | 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 | ||
+ | ===== Bitwise OR (|) ===== | ||
+ | |||
+ | The bitwise OR operator in C++ is the vertical bar symbol, |. Like the & operator, | operates independently each bit in its two surrounding integer expressions, | ||
+ | <code cpp> | ||
+ | 0 0 1 1 operand1 | ||
+ | 0 1 0 1 operand2 | ||
+ | ---------- | ||
+ | 0 1 1 1 (operand1 | operand2) - returned result | ||
+ | < | ||
+ | Here is an example of the bitwise OR used in a snippet of C++ code: | ||
+ | <code cpp> | ||
+ | int a = 92; // in binary: 0000000001011100 | ||
+ | int b = 101; // in binary: 0000000001100101 | ||
+ | int c = a | b; // result: | ||
+ | </ | ||
+ | ===== Example Program ===== | ||
+ | |||
+ | A common job for the bitwise AND and OR operators is what programmers call Read-Modify-Write on a port. On microcontrollers, | ||
+ | |||
+ | |||
+ | PORTD is a built-in constant that refers to the output states of digital pins 0, | ||
+ | Our algorithm for the program is: | ||
+ | * Get PORTD and clear out only the bits corresponding to the pins we wish to control (with bitwise AND). | ||
+ | * Combine the modified PORTD value with the new value for the pins under control (with biwise OR). | ||
+ | <code cpp> | ||
+ | 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, | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | for (i=0; i<64; i++){ | ||
+ | |||
+ | PORTD = PORTD & B00000011; | ||
+ | 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, | ||
+ | delay(100); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ===== Bitwise XOR (^) ===== | ||
+ | |||
+ | There is a somewhat unusual operator in C++ called bitwise EXCLUSIVE OR, also known as bitwise XOR. (In English this is usually pronounced " | ||
+ | <code cpp> | ||
+ | 0 0 1 1 operand1 | ||
+ | 0 1 0 1 operand2 | ||
+ | ---------- | ||
+ | 0 1 1 0 (operand1 ^ operand2) - returned result | ||
+ | </ | ||
+ | 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. | ||
+ | |||
+ | |||
+ | Here is a simple code example: | ||
+ | <code cpp> | ||
+ | int x = 12; // binary: 1100 | ||
+ | int y = 10; // binary: 1010 | ||
+ | int z = x ^ y; // binary: 0110, or decimal 6 | ||
+ | </ | ||
+ | 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. | ||
+ | <code cpp> | ||
+ | // 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; | ||
+ | delay(100); | ||
+ | } | ||
+ | </ | ||
+ | |||