最近学习Goland,巩固计算机基础
原码,反码,补码,异或
package main
import (
"fmt"
)
func main() {
fmt.Println( -2 ^ 2 )
/*
-2 > 源码 1000 0010 反码 1111 1101 补码 1111 1110
2 => 源码 0000 0010 反码 0000 0010 补码 0000 0010
异或(^) 相同为0 不同为1
异或后补码 1111 1100 (负数)
补码 --> 源码 减一 取反
异或后反码 1111 1011 (负数)
异或后源码 1000 0100 => -4
*/
fmt.Println( -2 ^ -4 )
/*
-2 => 源码 1000 0010 反码 1111 1101 补码 1111 1110
-4 => 源码 1000 0100 反码 1111 1011 补码 1111 1100
异或(^) 相同为0 不同为1
异或后补码 0000 0010
因为异或出来的补码是正数 所以原码也是一样 --> 2
*/
}
位运算
package main
import (
"fmt"
)
func main() {
fmt.Println(-11>>2)
/*
右移 -> 低位移除,符号不变,高位用符号位来补
-11 原码 1000 1011 反码 1111 0100 补码 1111 0101
1111 0101 右移 1111 1101 负数
1111 1101 负数(补码)
1111 1100 负数(反码)
1000 0011 负数(原码) -> -3
*/
fmt.Println(-11<<2)
/*
左移 -> 符号不变,低位补0
-11 原码 1000 1011 反码 1111 0100 补码 1111 0101
1111 0101 左移 1101 0100 负数
1101 0100 负数(补码)
1101 0011 负数(反码)
1010 1100 负数(原码) -> -44 = 32 + 4 + 8
*/
}