![RISC-V体系结构编程与实践(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/824/51892824/b_51892824.jpg)
上QQ阅读APP看书,第一时间看更新
3.6 位操作指令
RV64I指令集提供与(and)、或(or)以及异或(xor)等位操作指令,如表3.5所示。
表3.5 位操作指令
![](https://epubservercos.yuewen.com/58B490/30654369103831606/epubprivate/OEBPS/Images/table_3c86dca4-2ef7-45fb-a362-04f3183c4495.png?sign=1739523223-AyWXA1xsNZx4IGZYAAg9iGbPRUh2Af4v-0-84cc35bab68531974e0ec043ece492c8)
异或操作的真值表如下(“^”表示异或)。
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);
}