在此之前我们先在回顾一下二进制数的原码、反码及补码
正数的二进制数的原码、反码及补码一致;负数的二进制数的原码最高为为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。