3.6 位操作指令

RV64I指令集提供与(and)、或(or)以及异或(xor)等位操作指令,如表3.5所示。

表3.5 位操作指令

异或操作的真值表如下(“^”表示异或)。

0 ^ 0 = 0

0 ^ 1 = 1

1 ^ 0 = 1

1 ^ 1 = 0

从上述真值表可以发现以下3点。

0异或任何数 = 任何数。

1异或任何数 = 任何数取反。

任何数异或自己都等于0。

利用上述特点,异或操作有如下几个非常常用的场景。

使某些特定的位翻转。例如,若想把0b1010 0001的第1位和第2位翻转,则可以将该数与0b0000 0110进行按位异或运算。

10100001 ^ 00000110 = 10100111

交换两个数。例如,要交换a=0b1010 0001和b=0b0000 0110的值,可通过下列语句实现。

        a = a^b;     //a=1010 0111
        b = b^a;     //b=1010 0001
        a = a^b;     //a=0000 0110

在汇编代码里把变量设置为0。

xor x1, x1

判断两个数是否相等。

bool is_identical(int a, int b)
{
    return ((a ^ b) == 0);
}