前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言(操作符)1

C语言(操作符)1

作者头像
_小羊_
发布于 2024-10-16 06:50:40
发布于 2024-10-16 06:50:40
990
举报
文章被收录于专栏:C++C++

1、操作符的分类

(1)算术操作符:+、-、*、/、%

(2)移位操作符:<<、>>

(3)位操作符:&、|、^、~

(4)赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=

(5)单目操作符:!、++、--、&、*、+、-、~、sizeof、(类型)

(6)关系操作符:>、>=、<、<=、==、!=

(7)逻辑操作符:&&、||

(8)条件操作符:?:

(9)逗号表达式:,

(10)下标引用:[ ]

(11)函数调用:()

(12)结构体成员访问:. 、->

2、原码、反码、补码

整数的二进制表示方法有三种,即原码、反码和补码,有符号整数的三种表示方法均由符号位数值位组成,二进制序列中,最高位的1位是符号位,后面的都是数值位。符号位0表示正,1表示负

正整数和无符号整数的原码、反码和补码都相同,负整数的三种表示方法各有不同。

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码;

反码:将原码的符号位不变,数值位按位取反就是反码;

补码:反码+1得到补码。

原码转换补码、补码转换原码都是取反+1

对整型来说,数据在内存中存放的是补码。为什么呢?

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码可以将符号位和数值位统一处理。同时,加法和减法也可以统一处理,因为CPU只有加法器。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

比如,我们计算1-1,因为CPU只有加法器,所以我们用1+(-1)的形式计算:

3、移位操作符

(1)移动的是存储在内存中二进制位(补码);

(2)移位操作符的操作数只能是整数;

3.1 左移操作符:<<

移位规则:左边抛弃,右边补0

将10左移一位:

将-5左移一位:

规律:左移一位有乘2的效果;同样的,左移n位等于乘以2的n次方

3.2 右移操作符:>>

移位规则:(1)逻辑右移:左边补0;右边丢弃

(2)算术右移:左边补原该值的符号位,右边丢弃

逻辑右移或算术右移是取决于编译器的,通常采用的都是算术右移

将10右移一位:

将-4右移一位:

规律:右移一位有除2的效果,同样的,右移n位等于除以2的n次方

注意:对于移位操作符,不要移动负数位,这个是未定义的。

4、位操作符

注意:它们的操作数也必须都是整数。

&:按位与(有0则为0)

因为3与-6的结果为正数,补码和原码相同,所以这里直接用了补码计算。

|:按位或(有1则为1)
^:按位异或(相同为0,相异为1)
~:按位取反(单目操作符)

例题1: 不能创建临时变量,实现两个整数的交换

方法一:要实现两个整数的交换,我们首先会想到创建一个临时变量来解决。

这无疑是一个最简单高效的方法。但题目明确说明了不能创建临时变量,那我们就要另想办法了。

方法二:既然不能创建临时变量,那我们只能对这两个数本身下手了。

大家觉得上面这个办法怎么样?我们按照题目要求完成了任务。

但是,这个办法是受限的。如果两个整数太大的话相加会溢出,那有没有完美的办法呢?

既然这样问,那答案肯定是有的,办法就在我们上面新学到的知识中。

方法三:使用异或操作符

不知道你第一次看到这个代码的时候有没有懵逼呢?反正我是挺惊讶的。那接下来我们就来分析上面的代码具体是怎么实现的。

首先我们知道,按位异或操作符的规则是:相同为0,想异为1。因为4^4=0,所以a^a=0;因为4^0=4,所以a^0=a;因为4^4^5=5,经过计算4^5^4=5,所以异或操作符是支持交换律的。

因为异或操作符不存在进位,所以不会发生溢出。 需要说明的是,这只是我们为了加深对异或操作符的理解而想出的一个题目,未来我们交换两个整数还是用创建临时变量的方法更好,可读性高,效率高。

例题2:编写代码求一个整数存储在内存中的二进制中1的个数

方法一:我们可以想办法拿到二进制的每一位,然后统计1的个数。

说起拿到二进制的每一位,就想到了我们之前的一个例题,其中有拿到十进制数的每一位的方法,通过模10除10即可;同样的,我们也可以通过模2除2来得到二进制数的每一位。

10的二进制表示为1010,有2个1。 看似我们完成了要求,但当我们输入负数的时候,结果却是错的。原因在于形参是有符号的整型,负数取模的结果不会为1,很显然这个方法对负数不起作用。我们把形参定义为无符号的整型,当负数传过来的时候,我们把它当做无符号的整型看待,因为无符号整型的原码、反码、补码都相同,这时候就把这个无符号整形看作一个很大的正数,从而解决问题。

方法二:对整数二进制的最低位与1再向右移位,循环执行。这个方法不用关心是不是有符号无符号数的问题。

我们利用按位与的特点,如果二进制最低位是1,按位与1得到1;如果二进制最低位是0,按位与1得到0;再循环执行,我们就能得到二进制中1的个数。

这个方法也是可行的, 但它还不是最优的。

方法三:其实有一个专门用来计算一个数的二进制表示中有多少个1的算法:n &= (n - 1)

这个算法牛逼的地方在于,n &= (n - 1) 这个式子执行一次,二进制表示的数就会少一个1,执行多少次,就有多少个1;也就是说输入的数有几个1就执行几次,效率很高。

这种算法除非见过,一般人还真想不出来,不过我们记住就行,不必太执着其中的原理。

例题3:判断一个数是不是2的次方数

2的次方数,有没有什么特点呢?通过上面我们了解了二进制,很容易就能想到,2的次方数二进制表示中只有一个1,那我们利用上面方法三中的代码判断结果是不是1就行了。虽然能解决问题,但是这个方法有点啰嗦。

我们知道2的次方数二进制表示中只有一个1,而 n &= (n - 1) 这个式子执行一次,二进制表示的数就会少一个1,那如果 n &= (n - 1) 等于0的话,不就说明 n 是2的次方数吗?

例题4:二进制位置0或置1

编写代码将11二进制表示的第五位修改为1,然后再改回0。

11的二进制表示:00000000000000000000000000001011

修改第五位为1: 00000000000000000000000000011011

再将第五位改回:00000000000000000000000000001011

只改第五位,其他位不能改变要怎么实现呢?这就要用到我们学过的按位或(|)操作符了,我们知道,按位或操作符的规则是有1则为1,那我们给11的二进制按位或00000000000000000000000000010000就可以实现只修改第五位而其他位不变的效果,而这个数我们只需要给1向左移4位就能得到。

那再将第五位修改回来,方法应该也跟上面差不多。这里就要用到按位与(&)操作符,我们知道按位与操作符的规则是有0则为0,那我们给修改过的数按位与上11111111111111111111111111101111就可以实现只修改第五位而保持其他位不变的效果,而这个数我们只需要给1向左移4位再按位取反就能得到。

通过上面几个例题,我们可以深刻体会到操作符背后强大的功能,而这些作用我们在没有深入学习之前可能根本想象不到。 操作符的作用是很大的,尤其是在嵌入式中,使用操作符来实现一些功能及其频繁。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言---------对操作符的进一步认识
2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位。 符号位都是⽤0表⽰“正”,⽤1表⽰“负”。
阑梦清川
2025/02/24
640
C语言学习入门之操作符详解(上)
00000000 00000000 00000000 00000101 5的二进制补码
Yolo112
2023/11/21
3440
C语言学习入门之操作符详解(上)
C语言:操作符详解(超详细的操作符详解)
下面这代码的加法运算,是先把a和b原码转换成反码在进行加法运算,加完后在转换成原码进行输出,减法运算同理
逆向-落叶
2024/10/28
1740
C语言:操作符详解(超详细的操作符详解)
C语言(7)----操作符
C语言中的操作符是用来进行各种数学运算、逻辑运算、位运算、赋值等操作的符号,那么看着是不是就和我们日常生活中的这些语法结构很像呢?
Skrrapper
2024/06/18
1370
C语言(7)----操作符
【C】操作符——知识点大全(简洁,全面)
YY的秘密代码小屋
2024/01/22
1450
【C】操作符——知识点大全(简洁,全面)
【C语言】操作符(上)
有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做为符号位,剩余的都是数值位。
云边有个稻草人
2024/10/21
820
【C语言】操作符(上)
操作符超详解(下)
        在介绍下篇操作符之前我先介绍一下,其中,移位操作符、位操作符的使用是在整形变量里,而整形数据存放内存中其实存放的是补码,所以开篇我会介绍一下二进制里的原码、反码、补码的基础概念,解引用操作符(*)和,取地址操作符(&),涉及指针的运用,下标引用操作符涉及数组。
技匠晓晨
2024/11/26
950
操作符超详解(下)
【C语言】操作符超详细总结
• 算术操作符: + 、- 、* 、/ 、% • 移位操作符: << >> • 位操作符: & | ^ • 赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^= • 单目操作符: !、++、–、&、、+、-、~ 、sizeof、(类型) • 关系操作符: > 、>= 、< 、<= 、 == 、 != • 逻辑操作符: && 、|| • 条件操作符: ? : • 逗号表达式:, • 下标引用: [] • 函数调用: () • 结构成员访问: . 、->
用户11290673
2024/09/25
990
【C语言】操作符超详细总结
C语言---操作符详解
• 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、>= 、&= 、|= 、^=
Undoom
2024/09/23
920
第10讲:操作符详解
• 赋值操作符: = 、 += 、 -= 、 *= 、 /= 、 %= 、 <<= 、 >>= 、 &= 、 |= 、 ^=
用户11290648
2024/09/25
850
第10讲:操作符详解
【C语言】操作符详解1(含进制转换,原反补码)
    上述的操作符,我们已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单⽬操作符,今天继续介绍⼀部分,操作符中有⼀些操作符和⼆进制有关系,我们先铺垫⼀下⼆进制的和进制转换的知识
TANGLONG
2024/10/15
2360
【C语言】操作符详解1(含进制转换,原反补码)
【C语言初阶】什么操作符你还没搞懂?试试这篇文章让你彻底理解各种操作符!
🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》
鸽芷咕
2023/12/25
1900
【C语言初阶】什么操作符你还没搞懂?试试这篇文章让你彻底理解各种操作符!
回溯2:深入探讨C语言中的操作符 —— 从基础到进阶
在编写C语言程序的过程中,操作符是我们不可避免要使用的工具之一。无论是在简单的计算还是复杂的逻辑处理中,操作符的运用决定了程序的执行效果和效率。在这篇文章中,我们将结合实际的C语言代码,详细探讨C语言中各类操作符的使用、背后的原理以及如何利用它们提升代码质量和效率。通过清晰的讲解和丰富的代码示例,帮助读者更好地理解和掌握C语言操作符的用法。
用户11289931
2024/11/24
1460
C语言初阶七:C语言操作符详解(1)
这篇文章是对之前文章中操作符的补充,可以看之前的文章:C语言初阶:六.算数操作_如何用编程表示除法-CSDN博客
折枝寄北
2024/11/19
1040
C语言 —— 愿此世如黄金般辉煌 - 进制转换与操作符详解
https://zh.cppreference.com/w/c/language/operator_precedence
迷迭所归处
2025/03/09
720
C语言 —— 愿此世如黄金般辉煌 - 进制转换与操作符详解
操作符详解(一)
赋值操作符: = += -= *= /= %= <<= >>= &= |= ^=
秋邱
2024/10/09
1020
操作符详解(一)
操作符详细超解说
操作符在编程中扮演着至关重要的角色,它们用于执行各种操作,如算术运算、逻辑判断、位操作等。下面是一些常见的操作符分类:
池央
2024/10/11
2030
操作符详细超解说
操作符细节补充
比如-6(一个整型4个字节),它的原码就是100000000000000000000110
_lazy
2024/10/16
910
操作符细节补充
【初级】C语言——详解操作符
                浮点型的除法 1.0/2      1/2.0--->0.5
xxxflower
2023/04/16
5920
【初级】C语言——详解操作符
我与C语言二周目邂逅vlog——5.操作符详解
其实10进制的123表⽰的值是⼀百⼆⼗三,为什么是这个值呢?其实10进制的每⼀位是有权重的,10 进制的数字从右向左是个位、⼗位、百位....
hope kc
2024/09/23
900
我与C语言二周目邂逅vlog——5.操作符详解
相关推荐
C语言---------对操作符的进一步认识
更多 >
加入讨论
的问答专区 >
1高级后端开发工程师擅长3个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档