运算符--就要学习Go语言

栏目: Go · 发布时间: 6年前

内容简介:算术运算符输出:作为二元运算符时是
+    sum                    integers, floats, complex values (复数), strings
-    difference             integers, floats, complex values
*    product                integers, floats, complex values
/    quotient               integers, floats, complex values
%    remainder              integers

位运算符:
&    bitwise AND (按位与)                integers
|    bitwise OR (按位或)                 integers
^    bitwise XOR (按位异或)              integers
&^   bit clear (AND NOT 按位置零)        integers

移位运算符:
<<   left shift             integer << unsigned integer
>>   right shift            integer >> unsigned integer
复制代码

算术运算符 +-*/ 适用于整数、浮点数和复数, + 也适用于字符串,用于字符串连接;取模运算 % 仅适用整数间的运算,Go语言中, % 取模运算符的结果的符号和被取模数的符号总是一致的,因此 -5%3-5%-3 结果都是 -2 。除法运算符 / 的结果依赖于操作数是否为全为整数,比如 5.0/4.0 的结果是 1.25 ,但是 5/4 的结果是 1 ,因为整数除法会向着0方向截断余数;位运算和移位运算只适用整型。 位操作运算符 ^ ,作为一元运算符,表示 按位取反 ,就是说,它返回一个每个bit位都取反的数:作用类似在C、C#、 Java 语言中中符号 ~ ,对于 有符号的整数 来说,是按照 补码 进行取反操作的(快速计算方法:对数a取反,结果为 -(a+1) );对于 无符号整数 来说就是按位取反。

var a int8 = 3
var b uint8 = 3
var c int8 = -3

fmt.Printf("^%b=%b %d\n", a, ^a, ^a) // ^11=-100 -4
fmt.Printf("^%b=%b %d\n", b, ^b, ^b) // ^11=11111100 252
fmt.Printf("^%b=%b %d\n", c, ^c, ^c) // ^-11=10 2
复制代码

输出:

^11=-100 -4
^11=11111100 252
^-11=10 2
复制代码

作为二元运算符时是 按位异或 :对应位,相同为0,相异为1。

var a int8 = 3
var c int8 = 5

fmt.Printf("a: %08b\n",a)
fmt.Printf("c: %08b\n",c)
fmt.Printf("a^c: %08b\n",a ^ c)
复制代码

输出:

a: 00000011
c: 00000101
a^c: 00000110
复制代码

加法和减法运算符: +- 也可以作为一元操作符: 对于整数, +x0+x 的简写, -x 则是 0-x 的简写;对于浮点数和复数, +x 就是 x-x 则是 x 的负数。 需要给大家提一下的是这个操作符: 按位置零 &^ ,表达式 z = x &^ y ,如果 y 中的bit位为1,则 z 对应bit位为0,否则 z 对应bit位等于 x 中相应的bit位的值。不知道大家发现没有,我们还可以这样理解 或操作符 | ,表达式 z = x | y ,如果 y 中的bit位为1,则 z 对应bit位为1,否则 z 对应bit位等于 x 中相应的bit位的值,与 &^ 完全相反。

var x uint8 = 214
var y uint8 = 92
fmt.Printf("x: %08b\n",x)
fmt.Printf("y: %08b\n",y)
fmt.Printf("x|y: %08b\n",x | y)
fmt.Printf("x&^y: %08b\n",x &^ y)
复制代码

输出:

x: 11010110
y: 01011100
x|y: 11011110
x&^y: 10000010
复制代码

移位运算符 x<<nx>>n ,如果左边的操作数是有符号整型,则是算术移位;如果左边的操作数是无符号整型,则是逻辑移位。逻辑移位不用考虑符号位,而算术移位需要考虑符号位,这样能保证 移位操作乘除的操作 一致。对于 x<<1 ,相当于 x*2x>>1 ,相当于 x/2 ;左移算术移位结果会向下取整:

var a int8 = -51
fmt.Println("a:")
fmt.Printf("%08b\n",a)
fmt.Printf("%d: %08b\n", a>>1, a>>1)

var b int8 = 51
fmt.Println("b:")
fmt.Printf("%08b\n",b)
fmt.Printf("%d: %08b\n", b>>1, b>>1)

var i uint8 = 1
fmt.Println("i:")
fmt.Printf("%d: %08b\n", i<<1, i<<1) //2: 00000010
fmt.Printf("%d: %08b\n", i<<7, i<<7) //128: 10000000
fmt.Printf("%d: %b\n", i<<8, i<<8) //0: 0
var i2 int8 = 1
fmt.Println("i2:")
fmt.Printf("%d: %08b\n", i2<<1, i2<<1) //2: 00000010
fmt.Printf("%d: %08b\n", i2<<7, i2<<7) //-128: -10000000
fmt.Printf("%d: %b\n", i2<<8, i2<<8) //0: 0
var i3 int8 = -1
fmt.Println("i3:")
fmt.Printf("%d: %08b\n", -i3<<1, -i3<<1) //2: 00000010
fmt.Printf("%d: %08b\n", -i3<<7, -i3<<7) //-128: -10000000
fmt.Printf("%d: %b\n", -i3<<8, -i3<<8) //0: 0
var i4 int8 = -128
fmt.Println("i4:")
fmt.Printf("%d: %08b\n", -i4>>0, -i4>>0) //-128: -10000000
fmt.Printf("%d: %08b\n", -i4>>1, -i4>>1) //-64: -1000000
fmt.Printf("%d: %b\n", -i4>>2, -i4>>2) //-32: -100000
复制代码

输出:

a:
-0110011
-26: -0011010
b:
00110011
25: 00011001
i:
2: 00000010
128: 10000000
0: 0
i2:
2: 00000010
-128: -10000000
0: 0
i3:
2: 00000010
-128: -10000000
0: 0
i4:
-128: -10000000
-64: -1000000
-32: -100000
复制代码

字符串连接可以使用 ++= 运算符:

c := " Seekload"
s := "Hi" + string(c)
s += ", good bye"
复制代码

整型溢出: 有符号整数的 +-*<< 的操作的结果的溢出不会导致异常,但结果可能不是你想要的,比如 x < x+1 并不总是成立,比如:

var x int8 = 127;
fmt.Printf("%d\n",x+2)   //输出 -127
复制代码

无符号整数的+、-、*、<<的操作的结果会取模2^n, 也就是溢出的位会被丢掉, 比如:

var x uint8 = 255;
fmt.Printf("%d\n",x+2)    // 输出:1
复制代码

比较运算符

两个相同的整数类型可以使用下面的二元比较运算符进行比较,比较表达式的结果是布尔类型。

运算符--就要学习 <a href='https://www.codercto.com/topics/6127.html'>Go</a> 语言

布尔型、数字类型和字符串等基本类型都是可比较的,一些基本的比较操作我就不在这列举了,大家可以实操下,等大家学到后面,我会开一个篇文章详解比较运算符。

逻辑运算符

符号  说明
&&   逻辑与  (p && q)  p、q全为true,(p && q)才为true
||   逻辑或  (p || q)  p、q至少一个为true,(p || q)就为true
!   逻辑非   !p  若p为true,则!p为false;若p为false,则!p为true;
复制代码

运算符优先级

一元运算符有最高的优先级。操作符 ++-- 只能构成语句,而不是表达式,因为它们不属于运算符序列。 下面是关于算术运算、逻辑运算和比较运算的二元运算符,按照优先级递减的顺序排列:

优先级   操作符
  5     *  /  %  <<  >>  &  &^
  4     +  -  |  ^
  3     ==  !=  <  <=  >  >=    
  2     &&
  1     ||
复制代码

从上面可以看出,二元运算符有五种优先级。在同一个优先级,使用左优先结合规则,但是使用括号可以明确优先顺序,使用括号也可以用于提升优先级,例如: mask & (1 << 28)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

智能时代

智能时代

吴军 / 中信出版集团 / 2016-8 / 68.00

大数据和机器智能的出现,对我们的技术发展、商业和社会都会产生重大的影响。作者吴军在《智能时代:大数据与智能革命重新定义未来》中指出,首先,我们在过去认为非常难以解决的问题,会因为大数据和机器智能的使用而迎刃而解,比如解决癌症个性化治疗的难题。同时,大数据和机器智能还会彻底改变未来的商业模式,很多传统的行业都将采用智能技术实现升级换代,同时改变原有的商业模式。大数据和机器智能对于未来社会的影响是全方......一起来看看 《智能时代》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具