最近学习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
	*/
}