位元AND运算 (&), 位元OR运算 (|), 位元XOR运算 (^)
位元运算子是用来计算变数的位元,它们可以帮忙解决各种常见的编程问题;更多有关位元运算的素材与教学可以参考这里。
描述和语法
下面是所有的运算子的语法还有说明,其他的细节可以在参考教学中找到。
位元运算 AND (&)
C++ 中位元运算 AND 以单一符号 & 表示,用在两个整数之间,位元运算 AND 运算子会运算每一个位元位置上的值(0/1),依据固定的规则:若两者皆为 1 则输出是 1,其余状况输出皆为 0;请参考以下范例:
0 0 1 1 运算元1
0 1 0 1 运算元2
0 0 0 1 (运算元1 & 运算元2) 回传结果
在 86duino 上 int 型别将是一个 32 位元的数值,所以用在两个 int 型别的变数上会产生 32 个 AND 运算去分别处理每个位元,像下面的程式码范例一样:
int a = 92; // in binary: 00000000000000000000000001011100 int b = 101; // in binary: 00000000000000000000000001100101 int c = a & b; // result: 00000000000000000000000001000100, or 68 in decimal.
每一个 a 与 b 的位元将会被位元运算 AND 所处理,而 32 个结果将会以二进制储存在 c 里面,结果会是二进制表示 01000100,以十进制表示则是 68。
最常使用的 AND 运算是从一个整数型别选定一个特别的位元(或多个),通常称为 masking(mask表示哪一些是想留存的值,或哪些是不想留存的)。
位元运算 OR (|)
C++ 中位元运算OR以竖线符号|表示,像是&运算子一样,位置写在两个整数之间,但是运算是不同的,若两者中有一个为 1 则输出是 1,只有两者皆为0时输出为 0;请参考以下范例:
0 0 1 1 运算元1
0 1 0 1 运算元2
0 1 1 1 (运算元1 | 运算元2) 回传结果
以下范例是位元运算 OR 的 C++ 程式码:
int a = 92; // in binary: 00000000000000000000000001011100 int b = 101; // in binary: 00000000000000000000000001100101 int c = a | b; // result: 00000000000000000000000001111101, or 125 in decimal.
位元运算 XOR (^)
这是一个特别的运算子,在 C++ 中称为 EXCLUSIVE OR,就是位元运算中的 XOR,位元运算 XOR 以插入符号^表示,其运算方式跟 OR 运算子非常相似,差别在于 XOR 是运算的两者中,其中一个位元为 1 而另一个为 0 时输出才是 1:
0 0 1 1 运算元1
0 1 0 1 运算元2
0 1 1 0 (运算元 ^ 运算2) 回传结果
从另一个角度看 XOR,若结果是 1 代表输入的两个位元不同,结果是 0 代表输入的两个位元相同。
以下是简单的程式码范例:
int x = 12; // binary: 1100 int y = 10; // binary: 1010 int z = x ^ y; // binary: 0110, or decimal 6
^ 运算子常用来整数 bit 的切换(0=>1 或是 1=>0);在 XOR 的运算中,如果 mask 的 bit 是 1 则会颠倒;如果是 0 则不会颠倒,保持原值。
See also
- && (Boolean AND)
- || (Boolean OR)
本页由热血青年 LBU 译自英文版。
The text of the 86Duino reference is a modification of the Arduino reference, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.