位元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.