异或运算
- 0^0=0
- 1^1=0
- 1^0=1
- 0^1=1
同为0,异为1 通常认为不进位的加法 运算满足交换律和结合律
package main
import (
"fmt"
)
func main() {
arr := [5]int{1,2,3,4,5}
swap(&arr,0,4)
fmt.Println(arr)
}
func swap(arr *[5]int, i int , j int){
arr[i] = arr[i] ^ arr[j]
arr[j] = arr[i] ^ arr[j] //arr[j] = arr[i] ^ arr[j] ^ arr[j] => arr[i] ^ (arr[j] ^ arr[j]) => arr[i] ^ 0 => arr[i]
arr[i] = arr[i] ^ arr[j] //arr[i] = arr[i] ^ arr[j] ^ arr[i] => (arr[i] ^ arr[i]) ^ arr[j] => 0 ^ arr[j] => arr[j]
}
// 结果:[5 2 3 4 1]
如果两个数是同一个地址空间,那么这么运算会置为0
package main
import (
"fmt"
)
func main() {
arr := [5]int{1,2,3,4,5}
swap(&arr,1,1)
fmt.Println(arr)
}
func swap(arr *[5]int, i int , j int){
arr[i] = arr[i] ^ arr[j]
arr[j] = arr[i] ^ arr[j]
arr[i] = arr[i] ^ arr[j]
}
// 结果:[1 0 3 4 5]
因为arr[i] = arr[i] ^ arr[j]
执行后 会将i和j下标对应的同一个元素修改为0,下一行代码再取数据时值已经变为0了,0^0的运算只能为0找不回原数据了