reference:language:bitwiseand
差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 前一修订版 | |||
| — | reference:language:bitwiseand [2025/10/11 02:55] (当前版本) – 外部编辑 127.0.0.1 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== Bitwise AND (&), Bitwise OR (|), Bitwise XOR (^) ====== | ||
| + | |||
| + | ===== 按位与(& | ||
| + | |||
| + | 按位操作符对变量进行位级别的计算。它们能解决很多常见的编程问题。下面的材料大多来自这个非常棒的按位运算指导。 | ||
| + | ===== 说明和语法 ===== | ||
| + | |||
| + | 下面是所有的运算符的说明和语法。进一步的详细资料,可参考教程。 | ||
| + | ===== 按位与(& | ||
| + | |||
| + | 位操作符与在C + +中是一个& | ||
| + | < | ||
| + | 0 0 1 1 运算元1 | ||
| + | 0 1 0 1 运算元2 | ||
| + | ---------- | ||
| + | 0 0 0 1(运算元1& | ||
| + | </ | ||
| + | 在ocrobot中,int类型为16位,所以在两个int表达式之间使用& | ||
| + | <code cpp> | ||
| + | int a = 92; // | ||
| + | int b = 101; // 二进制: 0000000001100101 | ||
| + | int c = a & b; // 结果: | ||
| + | </ | ||
| + | a和b的16位每位都进行按位与计算,计算结果存在c中,二进制结果是01000100,十进制结果是68. | ||
| + | |||
| + | 按位与最常见的作用是从整型变量中选取特定的位,也就是屏蔽。见下方的例子。 | ||
| + | ===== 按位或(|) ===== | ||
| + | |||
| + | 按位或操作符在C++中是|。和& | ||
| + | < | ||
| + | 0 0 1 1 运算元1 | ||
| + | 0 1 0 1 运算元2 | ||
| + | ---------- | ||
| + | 0 1 1 1(运算元1 | 运算元2) - 返回的结果 | ||
| + | </ | ||
| + | 这里是一个按位或运算在C + +代码片段: | ||
| + | <code cpp> | ||
| + | int a = 92; // 二进制: 0000000001011100 | ||
| + | int b = 101; // | ||
| + | int c = a | b; // 结果: | ||
| + | </ | ||
| + | ===== 示例程序 ===== | ||
| + | |||
| + | 按位与和按位或运算常用于端口的读取-修改-写入。在微控制器中,一个端口是一个8位数字,它用于表示引脚状态。对端口进行写入能同时操作所有引脚。 | ||
| + | |||
| + | PORTD是一个内置的常数,是指0, | ||
| + | |||
| + | 我们的算法的程序是: | ||
| + | |||
| + | 读取PORT并用按位与清除我们想要控制的引脚 | ||
| + | |||
| + | 用按位或对PORTD和新的值进行运算 | ||
| + | <code cpp> | ||
| + | int i; // 计数器 | ||
| + | int j; | ||
| + | |||
| + | void setup() | ||
| + | DDRD = DDRD | B11111100; // | ||
| + | // | ||
| + | serial.begin(9600); | ||
| + | } | ||
| + | |||
| + | void loop () { | ||
| + | for (i=0; i<64; i++){ | ||
| + | |||
| + | PORTD = PORTD & B00000011; | ||
| + | j = (i << 2); // | ||
| + | PORTD = PORTD | j; // | ||
| + | Serial.println(PORTD, | ||
| + | delay(100); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | ===== 按位异或(^) ===== | ||
| + | |||
| + | C++中有一个不常见的操作符叫按位异或,也叫做XOR(通常读作”eks-or“)。按位异或操作符用‘^' | ||
| + | < | ||
| + | 0 0 1 1 运算元1 | ||
| + | 0 1 0 1 运算元2 | ||
| + | ---------- | ||
| + | 0 1 1 0(运算元1 ^运算元2) - 返回的结果 | ||
| + | </ | ||
| + | 按位异或的另一种解释是如果两个位值相同则结果为0,否则为1。 | ||
| + | |||
| + | 下面是一个简单的代码示例: | ||
| + | < | ||
| + | int x = 12; // 二进制: 1100 | ||
| + | int y = 10; // 二进制: 1010 | ||
| + | int z = x ^ y; // 二进制: 0110, 或十进制 6 | ||
| + | </ | ||
| + | ^操作符通常用于将整型表达式中的某些位进行反转。在按位异或操作中如果掩盖为1,则此位反转;如果它是0,则此位保持不变。下面的程序能将5脚进行闪烁。 | ||
| + | <code cpp> | ||
| + | // Blink_Pin_5 | ||
| + | // | ||
| + | void setup(){ | ||
| + | DDRD = DDRD | B00100000; // | ||
| + | serial.begin(9600); | ||
| + | } | ||
| + | |||
| + | void loop () { | ||
| + | PORTD = PORTD ^ B00100000; | ||
| + | delay(100); | ||
| + | } | ||
| + | </ | ||
| + | |||
