在此之前我们先在回顾一下二进制数的原码、反码及补码

      正数的二进制数的原码、反码及补码一致;负数的二进制数的原码最高为为1,反码除最高为,其他位取反,补码是在反码上加1。好了,大致回顾一下我们继续讲解golang中的^(按位异或)和<<(左移) 、>>(右移)以及&^(位清移)这三个运算符吧。

一、golang中的 ^(按位异或)运算符

      首先说明一下,在golang中的^符号不代表次方运算符,而是对变量进行按位异或运算的,按位异或是什么的,就是比较两个变量的补码,相同为两个数量同就位0,不相同就为1,最后再获取得到的二进制数的原码,最后将至二进制原码转化为十进制所得到的值,就是参与运算的两个变量的按位异或的结果了。    

   下面我用几个例子来演示一下:

     例1: 

package main

import (

    "fmt"

)

func main(){

 var a int =100;//    0000 0110 0100 补码

 var b int = 200;//    0000 1100 1000 补码

 //相同为两个数量同就位0,不相同就为1;得到:   0000 1010 1100 

//我们把这个 0000 1010 1100 这个二进制数当成补码,去获得我们的二进制数原码

a = (b ^ a)      //   0000 1010 1100  原码

fmt.Println(a)

}

go run 文件名运行,得到运算结果:

 

将172转化为二进制数为: 0000 1010 1100

 例2: 

package main

import (

    "fmt"

)

func main(){

 var a int = -100;//    1111 1001 1100 补码

 var b int = 200;//     0000 1100 1000 补码

 //相同为两个数量同就位0,不相同就为1;得到:   1111 0101 0100 

//我们把这个 1111 0101 0100 这个二进制数当成补码,去获得我们的二进制数原码

a = (b ^ a)      //   1000 1010 1100  原码

fmt.Println(a)

}

go run 文件名运行,得到运算结果:

 

将 -172转化为二进制数为:  1000 1010 1100

以上两个例子就是在golang中使用^进行按位异或的计算

二、golang中的 << 与  >>运算符

  1、左移运算符(<<)将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)

      例: var a = 100; 

               a = a << 3;

      将100转化为二进制数 0000 0110 0100;左边舍弃3位,右边补上3个0;得到 0011 0010 0000

       将 0011 0010 0000转化为十进制得到 800

2、右移运算符(>>)将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

      例: var b = 200; 

               b = b >> 2;

      将200转化为二进制数 0000 1100 1000;右边舍弃2位,左边补上2个0;得到 0000 0011 0010

       将 0000 0011 0010转化为十进制得到 50

 

二、golang中的 &^(位清移)运算符

以上例子中 200 &^ 100 :

200的二进制数为: 0000 1100 1000 

100的二进制数为: 0000 0110 0100

对比两个二进制数,相同位一致当前位取 0,相同位不一致取 左边变量二进制数的当前位值

得到: 0000 1000 1000;转化为十进制为:136;

拿以上例子中 100 &^ 200 :

100的二进制数为: 0000 0110 0100

200的二进制数为: 0000 1100 1000 

对比两个二进制数,相同位一致当前位取 0,相同位不一致取 左边变量二进制数的当前位值

得到: 0000 0010 0100;转化为十进制为:36。