目录

kotlin的一些位运算

kotlin 部分位运算

先说测试结论:

1
2
3
4
5
6
println(1.inv()) // -2
println(0.inv()) // -1
println(1 xor 1) // 0
println(0 xor 1) // 1
println(1 xor 0) // 1
println(0 xor 0) // 0

在 kotlin 中, Int.inv() 实际相当于 Java 中的 ~int, 也就是按位取反 计算机在运行位运算的时候并不是真的在对我们看到的数进行位运算, 而是对其补码进行位运算, 但由于正数的补码是正数, 因此在不进行取反(事实上是不改变符号位)的情况下, 得到的结果和我们想象中的是一致的.

事实上我一度认为如果 a 为 0 或 1, 那么 a 与 1 异或的结果就是 a 取反, 与 0 异或的结果不变.

上面这句话后半句是对的, 但是取反就错了: 1 在计算机中实际储存是 0 0001, 0 是其符号位, 正数的补码就是其本身. 对其按位取反得到: 1 1110, 注意, 此处符号位也要一起取反. 在对其转换成原码: 1 0010, 运算规则是符号位不变, 其他位按位取反再加 1.

总结: 计算机内的是补码运算, 一定要注意符号位