位运算的思考题:
1)请看下面的代码段,回答a,b,c,d结果是多少?
func main() {
var a int = 1 >> 2
var b int = -1 >> 2
var c int = 1 << 2
var d int = -1 << 2
//a,b,c,d结果是多少
fmt.Println("a=", a)
fmt.Println("b=", b)
fmt.Println("c=", c)
fmt.Println("d=", d)
}
2) 请回答在golang中,下面的表达式运算的结果是:
func main() {
fmt.Println(2&3)
fmt.Println(2|3)
fmt.Println(13&7)
fmt.Println(5|4)
fmt.Println(-3^3)
}
二进制是逢2进位的进位制,0、1是基本算符。
源码、反码、补码
对于有符号的而言:
1)二进制的最高位是符号位:0表示正数,1表示负数
2)正数的源码,反码,补码都一样
3)负数的反码=它的源码符号位不变,其它位取反(0->1,1->0)
4)负数的补码=它的反码+1
5)0的反码,补码都是0
6)在计算机运算的时候,都是以补码的方式来运算的。
位运算符和移位运算符:
golang中有3个位运算
分别是" 按位与&、按位或|、按位异或^",它们的运算规则是:
按位与& : 两位全为1,结果为1,否则为0
按位或| : 两位有一个为1,结果为1,否则为0
按位异或^ : 两位一个为0,一个为1,结果为1,否则为0
练习:
比如: 2&3=? 2|3=? 2^3=?
2&3:
2的补码:0000 0010
3的补码:0000 0011
2&3 0000 0010
2|3:
2的补码:0000 0010
3的补码:0000 0011
2&3 0000 0011
2^3:
2的补码:0000 0010
3的补码:0000 0011
2^3 0000 0001
-2^2
-2的源码: 1000 0010 ==》反码 1111 1101==》1111 1110
2 的补码:0000 0010
-2^2 1111 1100(补码) ==》反码1111 1011 ==》源码1000 0100
func main() {
fmt.Println(2&3) //2
fmt.Println(2|3) //3
fmt.Println(2^3) //1
fmt.Println(-2^2) //-4
}
golang中有2个移位运算符:
>>、<< 右移和左移,运算规则:
右移运算符>>:低位溢出,符号位不变,并用符号位补溢出的高位
左移运算符<<:符号位不变,低位补0
案例演示:
a := 1 >> 2 //0000 0001 ==》0000 0000 ==》 0
c := 1 << 2 //0000 0001 ==》0000 0100 ==》 4