上QQ阅读APP看书,第一时间看更新
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);
}