位运算符
按位取反:1变成0,0变成1
按位与:每位都是1,结果才为1
按位或:每位只要有一个是1,结果就是1
异或:不同为1,相同为0
清除标志位:右侧数字的位上为1,清0,否则不清零
位左移:每左移一位扩大2倍
位右移:每右移一位除以2
func main() {
a,b:=5,6 //101 110
fmt.Println(^a) //按位取反 -6
fmt.Println(a&b) //按位与 4
fmt.Println(a|b) //按位或 7
fmt.Println(a^b) //异或 3
fmt.Println(a&^b) //右侧1表示清零 清除标志位
fmt.Println(a<<1) //10 相当于乘以2
fmt.Println(a>>1) //2 相当于除以2
}
思考:如下代码输出什么?
//练习一
const(
num1 int=1<<(iota*10)
num2
)
func main(){
fmt.Println(num1) //1
fmt.Println(num2) //1024
}
//练习二
const(
num1 int=10
num2 ="tom"
num3 int=1<<(iota*2)
)
func main(){
fmt.Println(num1) //10
fmt.Println(num2) //tom
fmt.Println(num3) //16
}
原码、反码、补码
正数的原码,反码,补码都是一样的。
负数的反码 = 原码的符号位不变,其他的位取反【最高位为符号位:正数为0,负数为1】
负数的补码 = 反码 + 1
5的原码=0101 反码=0101 补码=0101
-5的原码1101 反码=1010 补码=1011
[7]原码=0111 [7]反=0111 [7]补码=0111
[-7]原码=1111 [-7]反=1000 [-7]补码=1001
分析:为什么^5=-6
第一步:将5转成原码 = 0101
第二步:原码转成补码 =0101 (正数的原、反、补是一样的)
第三步:取反: =1010 (补码运算)
第四步:将补码转成反码:1010-1=1001 (反码)
第五步:将反码转成原码:1110 =-6
为什么使用补码计算机
1、 +0和-0表示方法一样
2、 利用高位溢出,将减法运算变成加法运算(利用补码运算可以将符号位参与运算)