Golang学习+深入(四)-运算符

目录

一、概述

1、算数运算符

2、关系运算符

3、逻辑运算符

4、赋值运算符

5、运算符优先级

6、位运算符

7、其他运算符

二、进制

1、进制转换

1、其他进制转十进制

2、十进制转其他进制

3、二进制转其他进制

4、其他进制转二进制

5、二进制在运算中的说明

三、原码、补码、反码


一、概述

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等

  1. 算数运算符
  2. 赋值运算符
  3. 比较运算符/关系运算符
  4. 逻辑运算符
  5. 位运算符
  6. 其他运算符

1、算数运算符

算数运算符是对数值类型的变量进行运算的,比如:加减乘除。在Go程序中使用的非常多。

  1. +:正号
  2. -:负号
  3. +:加
  4. -:减
  5. *:乘
  6. /:除
  7. %:取模(取余)
  8. ++:自增
  9. --:自减
  10. +:字符串相加

注:

  1. 对于除号"/",它的整数除和小数除是有区别的,整数之间做除法时,只保留整数部分而舍弃小数部分。例:x :=19/5,结果是 3
  2. 当对一个数取模时,可以等价 a%b=a-a/b*b
  3. Golang的自增和自减只能当作一个独立语言使用,不能这样使用 b:=a++ 或者 b:=a--
  4. Golang的++和--只能写在变量后面,不能写在变量的前面,即:只有a++ a--没有++a --a
  5. Golang的设计者去掉c/java中的自增自减的容易混淆的写法,让Golang更加简洁,统一。

2、关系运算符

  1. 关系运算符的结果都是bool型,也就是要么是true,要么是false

  2. 关系表达式经常用在if结构的条件中或循环结构的条件中

  3. '==':相等于

  4. '!=':不等于

  5. '<':小于

  6. '>':大于

  7. '<=':小于等于

  8. '>=':大于等于

package main
import (
	"fmt"
)

func main() {
	x :=19/5
	fmt.Println(x)
	var a = 5
	var b = 9
	fmt.Println("a%b=",a%b)
	fmt.Println("a-a/b*b=",a-a/b*b)
	var n1 int = 5
	var n2 int = 9
	fmt.Println(n1==n2)
	fmt.Println(n1!=n2)
	fmt.Println(n1<n2)
	fmt.Println(n1>n2)
	fmt.Println(n1<=n2)
	fmt.Println(n1>=n2)
}

3、逻辑运算符

用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个bool值。

  1. &&:逻辑与运算符。如果两边的操作数都是True,则为True,否则,为False。
  2. ||:逻辑与运算符。如果两边的操作数有一个True,则为True,否则,为False。
  3. !:逻辑非运算符。如果条件为True,则逻辑为False,否则为True。
  • &&也叫短路与,如果第一个条件为False,则第二个条件不会判断,最终结果为false
  • ||也叫短路或,如果第一个条件为true,则第二个条件不会判断,最终结果为true

4、赋值运算符

赋值运算符就是将某个运算后的值,赋给指定的变量。

  1. =:将一个表达式的值赋给左值,C=A+B
  2. +=:相加后再赋值,C+=A等于C=C+A
  3. -=:相减后再赋值,C-=A等于C=C-A
  4. =:相乘后再赋值,C=A等于C=C*A
  5. /=:相除后再赋值,C/=A等于C=C/A
  6. %=:求余后再赋值,C%=A等于C=C%A
  7. <<=:左移后再赋值,C<<=2等于C=C<<2
  8. ">>=":右移后再赋值,C>>=2等于C=C>>2
  9. &=:按位与后再赋值,C&=2等于C=C&2
  10. ^=:按位异或后再赋值,C^=2等于C=C^2
  11. |=:按位或后再赋值,C|=2等于C=C|2
  • 运算顺序从右往左
  • 赋值运算符的左边,只能是变量,右边可以是变量、表达式、常量值
面试题:
有两个变量,a和b,要求将其进行交换,但是不允许使用中间变量,最终打印结果。
package main
import (
	"fmt"
)
func main() {
	var a = 3
	var b = 5
	a=a+b
	b=a-b
	a=a-b
	fmt.Println(a,b)
}

5、运算符优先级

运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下,上面优先于下面

只有单目运算符、赋值运算符是从右向左运算的。

分类描述关联性
后缀()[]->.++ --左到右
单目+ - ! ~ (type)* & sizeof右到左
乘法* / %左到右
加法+ -左到右
移位<< >>左到右
关系< <= > >=左到右
相等== !=左到右
按位与&左到右
按位异或^左到右
按位或|左到右
逻辑与&&左到右
逻辑或||左到右
赋值运算符=: += -= *= /= %= <<= >>= &= ^= |=右到左
逗号,左到右

6、位运算符

  1. &:按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。运算规则是:同时为1,结果为1,否则为0.
  2. |:按位或运算符"|"是双目运算符。其功能是参与运算的两数各对应的二进位相或。运算规则是:有一个为1,结果为1,否则为0.
  3. ^:按位异或运算符"^"是双目运算符。其功能是参与运算的两数各对应的二进位相异或。运算规则是:当二进位不同时,结果为1,否则为0.
  4. <<:左移运算符"<<"是双目运算符。其功能把"<<"左边的运算数的各二进制位全部左移若干位,高位丢失,低位补0.左移n位就是乘以2的n次方。
  5. ">>":右移运算符">>"是双目运算符。其功能把">>"左边的运算数的各二进制位全部右移若干位.右移n位就是除以2的n次方。
package main
import (
	"fmt"
)
func main() {
	var a int = 1 >> 2
	var b int = -1 >> 2
	var c int = 1 << 2
	var d int = -1 << 2
	fmt.Println("a=",a)
	fmt.Println("b=",b)
	fmt.Println("c=",c)
	fmt.Println("d=",d)
	fmt.Println(2&3)
	fmt.Println(2|3)
	fmt.Println(13&7)
	fmt.Println(5|4)
	fmt.Println(-3^3)
}

7、其他运算符

  1. &:返回变量存储地址,&a 将给出变量a的实际地址
  2. *:指针变量, *a 是一个指针变量

Go语言明确不支持三元运算符

Golang的设计理念:一种事情有且只有一种方法完成

二、进制

对于整数,有四种表示方式:

  1. 二进制:0,1,满2进1.
  2. 十进制:0-9,满10进1.
  3. 八进制:0-7,满8进1,以数字0开头表示。
  4. 十六进制:0-9及A-F,满16进1,以0x或0X开头表示。此处A-F不区分大小写。如:0x21AF+1=0x21B0
package main
import (
	"fmt"
)
func main() {
	var i int = 5
	fmt.Printf("二进制输出i=%b\n",i)
	var j int = 011
	fmt.Println("八进制j=",j)
	var k int = 0x11
	fmt.Println("16进制k=",k)
}

1、进制转换

1、其他进制转十进制

1.1、二进制转十进制

规则:从最低位开始(右边的),将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。

1.2、八进制转十进制

规则:从最低位开始(右边的),将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。

1.3、十六进制转十进制

规则:从最低位开始(右边的),将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。

2、十进制转其他进制

2.1、十进制转二进制

规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。

2.2、十进制转八进制

规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。

2.3、十进制转十六进制

规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。

3、二进制转其他进制

3.1、二进制转八进制

规则:将二进制数每三位一组(从低位开始组合),转成对应的八进制数即可。

将二进制:11010101转成八进制。11010101=0325

3.2、二进制转十六进制

规则:将二进制数每四位一组(从低位开始组合),转成对应的十六进制数即可。

将二进制:11010101转成十六进制。11010101=D5

4、其他进制转二进制

4.1、八进制转二进制

规则:将八进制数每1位,转成对应的一个3位的二进制数即可。

将0237转成二进制. 0237=10011111

4.2、十六进制转二进制

规则:将十六进制数每1位,转成对应的一个4位的二进制数即可。

将0x237转成二进制. 0x237=1000110111

5、二进制在运算中的说明

二进制是逢2进位的进位制,0、1是基本算符。

现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是"逢2进1",数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。

三、原码、补码、反码

对于有符号的而言:

  1. 二进制的最高位是符号位:0表示正数,1表示负数。
  2. 正数的原码,反码,补码都一样。
  3. 负数的反码=它的原码符号位不变,其他位取反(0-->1,1-->0)。
  4. 负数的补码=它的反码+1。
  5. 0的反码,补码都是0。
  6. 在计算机运算的时候,都是以补码的方式来运算的
1===>原码:[0000 0001]反码:[0000 0001]补码:[0000 0001]
-1==>原码:[1000 0001]反码:[1111 1110]补码:[1111 1111]
按位与&:两位全为1,结果为1,否则为0
按位或|:两位有一个为1,结果为1,否则为0
按位异或:两位一个为0,一个为1,结果为1,否则为0
计算:
2&3=2
2的补码:[0000 0010] 
3的补码:[0000 0011]
2&3的补码:[0000 0010]=2
2|3=3
2的补码:[0000 0010] 
3的补码:[0000 0011]
2|3的补码:[0000 0011]=3
2^3=1
2的补码:[0000 0010] 
3的补码:[0000 0011]
2^3的补码:[0000 0001]=1
-2^2=-4
-2的原码:[1000 0010]反码:[1111 1101]补码:[1111 1110]
        [1111 1110]
2的补码:[0000 0010]
-2^2的补码:[1111 1100]反码:[1111 1011]原码:[1000 0100]=-4
>>、<<右移和左移运算规则:
右移运算符>>:低位溢出,符号位不变,并用符号位补溢出的高位
左移运算符<<:符号位不变,低位补0
1>>2=0
1的补码:[0000 0001] 右移[0000 0000]=0
1<<2=4
1的补码:[0000 0001] 左移[0000 0100]=4

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/5907.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言程序笔记(1)

C语言笔记&#xff08;1&#xff09;——B站翁恺视频 程序框架 #include <stdio.h> int main() {//printf("hello world!\n");return 0; }1、变量与常量。 例子1&#xff1a; #include <stdio.h> int main() {printf("1234%d",1234);return …

图解LeetCode——合并两个有序链表

如果你喜欢这篇文章的话&#xff0c;请给作者点赞关注哟&#xff0c;你的支持是我不断前进的动力&#xff01; 目录 题目描述&#xff1a; 解法&#xff1a; 完整代码&#xff1a; 结果 题目链接&#xff1a;力扣 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序…

2017世界互联网领先成果来了 光量子计算机

演讲者&#xff1a;陆朝阳中国科学技术大学教授 发布了世界上首台超越早期经典计算机的光量子计算机 陆朝阳&#xff1a;很高兴向大家报告中国科学院在量子计算这个领域取得的基础性的研究成果。 我们知道50多年以来摩尔定律一直见证着计算机的更新换代&#xff0c;之前每过18个…

【新2023Q2模拟题JAVA】华为OD机试 - 绘图机器

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:绘图机器 题目 绘图机器的绘…

读书笔记-纳瓦尔宝典-2023.04.01

重点 财富 如何构造高价值信息 判断力 何为幸福 启发 最近看了这本书的大部分内容&#xff0c;感悟颇多&#xff0c;及时记录下来。 因为是快速阅读&#xff0c;还未做深入思考和实践&#xff0c;但对总体的内容有一个大致把握&#xff0c;未来会结合行动反复阅读和思考&…

python画爱心代码

前几天在网上看到了一个画爱心的教程&#xff0c;就是在 Python里面画一个爱心&#xff0c;但是我在网上找到的代码不是很好用&#xff0c;所以我就自己写了一遍。 首先我们先创建一个新的 python文件。新建一个 python文件夹&#xff0c;将我们之前的那个 python文件夹复制到这…

蓝桥杯·3月份刷题集训Day03

本篇博客旨在记录自已打卡蓝桥杯3月份刷题集训&#xff0c;同时会有自己的思路及代码解答希望可以给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉&#x1f4aa;。 文…

2021年第十二届蓝桥杯省赛Java B组真题及详细题解

A试题 : ASC【填空题】 本题总分&#xff1a; 5 分 【1、问题描述】 已知大写字母 A 的 ASCII 码为 65&#xff0c;请问大写字母 L 的 ASCII 码是多少&#xff1f; 【2、答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#…

二十、Javascript API(一)

1. Atomics和SharedArrayBuffer 多个上下文访问 SharedArrayBuffer时&#xff0c;如果同时对缓冲区执行操作&#xff0c;就可能出现资源争用问题。Atomics API 通过强制同一时刻只能对缓冲区执行一个操作&#xff0c;可以让多个上下文安全地读写一个SharedArrayBuffer。 1.1 …

Android HTTP请求方式

1.HttpClient使用流程 基本流程&#xff1a; 2.HttpClient使用示例 1&#xff09;使用HttpClient发送GET请求 直接贴下简单的发送Get请求的代码&#xff1a; public class MainActivity extends Activity implements OnClickListener { private Button btnGet; private WebV…

STM-32:GPIO 输出-点亮LED-流水灯-蜂鸣器

目录一、GPIO1.1GPIO简介1.2GPIO 硬件解析1.2.1保护二极管1.2.2 P-MOS、N-MOS 管1.2.3数据输入输出寄存器1.2.4复用功能输出1.2.5模拟输入输出1.3GPIO 的工作模式1.3.1 输入模式 (模拟/浮空/上拉/下拉)1.3.2 输出模式 (推挽/开漏)1.3.3 复用功能 (推挽/开漏)1.3.4 小结二、GPIO…

ChatGPT将引发大量而普遍的网络安全隐患

ChatGPT是一个基于人工智能的语言生成模型&#xff0c;它可以在任何给定的时间&#xff0c;使用自然语言生成技术&#xff0c;生成文本、对话和文章。它不仅可以被用来编写文本&#xff0c;还可以用来编写语言、生成图像和视频。目前&#xff0c; ChatGPT已广泛应用于语言翻译、…

【数据结构篇】-树(共计两万字,你真的搞懂了它吗)

友情链接&#xff1a;【数据结构与算法】首篇 - 思维导图 - 各部分内容目录 文章目录&#x1f680;树&#x1f6a2;一、树的原理精讲&#xff08;一&#xff09;树的定义&#xff08;二&#xff09;基本术语&#xff08;三&#xff09;树的性质&#x1f6a2;二、树的存储结构&a…

C++ STL:stack和queue的使用和底层实现

目录 一. 什么是stack和deque 二. stack和queue的使用方法 2.1 stack的常用接口 2.2 queue的常用接口 三. stack和queue的底层实现原理 3.1 容器适配器 3.2 deque&#xff08;双端队列&#xff09;的概念及抽象结构 3.3 deque的底层实现结构 3.4 deque的优缺点 —— 为…

try... excpet BaseException(异常处理捕获)

try ...except 是最常见的捕获处理异常的结构&#xff0c;其主要作用是将可能出现问题的代码块用try &#xff1a;包裹起来&#xff0c;不至于出现错误让程序崩溃&#xff0c;无法执行下去常见的try ...excpet 的结构有三种try&#xff1a;pass except BaseException as e &…

Azure SQL基础到实战(2)-部署

目录Azure 上的数据库服务的演变Azure SQL 部署选项Azure 虚拟机上的 SQL ServerIaaS 与PaaS无版本数据库服务SQL 托管实例SQL 数据库弹性数据库池Azure 上的数据库服务的演变 Azure SQL 是 Microsoft 作为 Azure 云计算平台的一部分提供的云数据库产品/服务。 与其他版本的 S…

含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

算法---扫雷游戏

题目 让我们一起来玩扫雷游戏&#xff01; 给你一个大小为 m x n 二维字符矩阵 board &#xff0c;表示扫雷游戏的盘面&#xff0c;其中&#xff1a; ‘M’ 代表一个 未挖出的 地雷&#xff0c; ‘E’ 代表一个 未挖出的 空方块&#xff0c; ‘B’ 代表没有相邻&#xff08;…

服务器部署前后端分离项目

服务器部署前后端分离项目 文章目录服务器部署前后端分离项目一、安装环境安装jdk1、在/usr/local目录下创建jdk文件夹&#xff0c;并将jdk安装包放到/usr/local/jdk包下并解压2、配置jdk的环境变量3、进行编译&#xff0c;4、检测是否安装成功安装tomcat1、将tomcat放到/usr/l…

Linux内核模块开发之创建slab内存缓存(kmem_cache_*)

Linux内核模块开发之创建slab内存缓存&#xff08;kmem_cache_*&#xff09;一、创建专用的内存缓存编程接口二、实现步骤三、内存缓存的数据结构四、完整代码示例4.1、源代码4.2、编译和执行一、创建专用的内存缓存编程接口 创建内存缓存 kmem_cache_create。指定内存缓存分配…
最新文章