异或存在两个方式按位(bitwise)和逻辑(logic),软件中用于校验数据真伪一般使用按位异或方式。代码中按位异或的符号是^
,而计算器中则是⊻
,并且要注意的一点是:^
在计算器(或者Google搜索框中)中有另外一个意义次方
。程序代码中的数学计算公式很大一部分可以直接拷贝到计算器(或者Google搜索框)中直接计算,但涉及到异或
运算则不能再这样计算。
比如代码0x01^0x01
计算出来的是0,但是将公式拷贝到计算器中计算出来的是1,看如下:
而程序代码计算:
public class HelloWorld{
// 程序的入口
public static void main(String args[]){
// 向控制台输出信息
System.out.println(Integer.toHexString(0x01^0x01));
}
}
输出结果:0
基于常规运算+-*/
在代码公式和计算器的公式都是一致的,导致会习惯性的找Google或者计算器计算一下代码的中公式,而今遇到^
这个符号,在代码和计算器中的意义不一样,导致摔了一个大跟头。
补充:
异或计算一般是按照按位(这里的位是二进制位)进行异或这一点没有问题了,但是像串口传递过来的数据一般都是字符串,先转换成byte数组。会有按单个byte进行异或,还会有两个两个byte一起组成一个数再进行异或的。比如12345678
第一种方式是1^2^3^4^5^6^7^8
第二种方式是12^34^56^78
。
我具体困惑的原因是没有弄清楚是两位异或还是单位异或,导致计算结果不一致,开启了怀疑是「逻辑异或」还是「按位异或」的不归路。