位运算符

位运算的思考题:

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

原文地址:https://www.cnblogs.com/green-frog-2019/p/11342870.html