C/C++相关概念和易错知识点(3)(操作符、进制转换)

【CSP-J/S初赛知识点整理】 CSP-J/S初赛知识点整理 阅读详情

前言:首先,我的博客主要记录的是部分容易遗忘,但是比较重要或是值得了解的知识点。很多基本概念我并不会阐述,所以它更适合用来复习;其次,这些知识点是从我自己的角度出发整理的,因此我认为的重点可能和你不同,有的内容可能不完整或有错误,希望大家多多包涵,如果能指出我的错误,我会非常感激!

必要知识点储备:

(1)二进制、八进制、十进制、十六进制之间的转换技巧

十进制转二进制:

对于比较大的数字,有一个通用的求解方法

如1000,将它先除以2得到500,余数0,记录这个0

将500除以2得到250,余数0,记录这个0

将250除以2得到125,余数0,记录这个0

将125除以2得到62,余数1,记录这个1

将62除以2得到31,余数0,记录这个0

将31除以2得到15,余数1,记录这个1

将15除以2得到7,余数1,记录这个1

将7除以2得到3,余数1,记录这个1

将3除以2得到1,余数1,记录这个1

将1除以2得到0,余数1,记录这个1,停止计算

最后从下到上按顺序写出记录的数字1111 1010 00,这个数就是二进制的1000

二进制转八进制、十六进制:

我们知道2的3次方是8,2的4次方是16,所以3个二进制位就可以表示成一个八进制位

如01 101 011从右向左每三个分一组,换算成十进制数字,这个数字对应八进制的数字

011表示3,101表示5,01表示1,所以这个数字的八进制表示是0135,最前面的0是八进制标志

十六进制同理,每四位一组

如0110 1011换算后是0x6b

(2)原码、补码的相互转换

原码转为补码将原码除符号位取反后+1(负数)

补码转为原码将补码除符号位取反后+1(负数),这种方法更方便

补码存在的意义是使加法减法统一,CPU只能进行加法运算

操作符易忘知识点和易错法则

其中简单的我不会阐述,我会抓出易忘点和易错点

1.移位操作符(左移操作符和右移操作符细则区分)

左移操作符执行规则:左边抛弃,右边补0。

因此对于负数来说,左移后就变成了正数(有且只有这一种可能)

右移操作符的执行规则就比左移操作符的要复杂,有两种操作方式;

(1)逻辑右移:左边用0填充,右边丢弃(类似于左移操作符)

(2)算数右移:左边用该值的原符号位填充,右边丢弃。这意味着在算数右移的规则下,负数右移后还是负数,而逻辑右移下,移后的数一定是正数。

对于绝大部分编译器来说,都是采用算数右移,仍有少部分编译器采用逻辑右移。

但是对于所有编译器来说,左移规则相同。这里一定要注意区分!

注意:a >> -1这种操作未被定义,不要用!

2.位操作符

操作的对象都是二进制的补码,且只能是整数,意思是你输入的17会被转换成二进制再操作

如果你输入-1,则实际操作数是-1的补码

& 按位与:只要有0就是0,全为1才是1

| 按位或:只要有1就是1,全为0才是0

^ 按位异或:相同为0,相异为1(易混)

~ 按位取反:将所有位按位取反,不管它是不是符号位,取反后得到的还是补码,因此如果要打印取反后的数字,还要进行一次补码到原码的转换

相关操作技巧

(1)^ 按位异或:

a ^ a == 0 ;  a ^ 0 == a

接下来通过这个代码仔细体会异或操作


#include <stdio.h>

int main()
{
	int a = 100;

	int b = 200;

	printf("a=%d b=%d\n", a, b);

	a = a ^ b;

	b = a ^ b;

	a = a ^ b;

	printf("a=%d b=%d\n", a, b);
	
    return 0;
}

结果

0bd22832cb2c4ef79c7e55599b12861a.png

重要思考方式:a ^ b相当于一个密码,储存了a和b的信息,如果我拿到b的信息,我就能破解a(将a ^ b这个密码与b异或);如果我拿到a的信息,我就能破解b(将a ^ b这个密码与a异或)

(2)& 按位与

a & 1 == 1说明a的二进制位中最低位是1

a & 1 == 0说明a的二进制位中最低位是0

注意比较的依然是补码

cfc2bab6e4e94b18b5277ecc18d9ca83.png

有一个表达式值得琢磨:


	n = n & (n - 1);

	11111 - n;
	11110 - n - 1;

	11110 - n;//第一次操作后
	11101 - n - 1;

	11100 - n;//第二次操作后
	11011 - n - 1;

	11000 - n;//第三次操作后
	10111 - n - 1;

	10000 - n;//第四次操作后
	01111 - n - 1;

	00000 - n;//第五次操作后

每执行一次,最右边的1就会被去掉,其余位不受影响

(3)& 和 | 修改二进制数操作

合理利用& 和 |可以调整二进制数

让0变成1用|,使用时保证你要变的那位是1,其余都是0,用1 << n来实现

让1变成0用&,使用时保证你要变得那位是0,其余都是1,用 ~( 1 << n )来实现

(4)自定义类型、结构成员访问

注意:int [10]是一个自定义类型,int arr[10]中arr是数组名

struct也是自定义类型,包含成员列表。它相当于一个模具,在实际使用时创建结构体变量。

struct在访问成员时,可用.name表示,点操作符有两个操作数,使用方式是“结构体名.成员名”。第一个不需要时可以不写。

初始化结构体变量时,要么按成员列表顺序创建,要么使用.name初始化。

(5)操作符的优先级、结合性

优先级:一个表达式中运算符优先级高的先执行

一定是相邻操作符才有所谓的优先级之分

如果相邻两个操作符优先级相同,则由结合性决定先后,一般是从左到右结合,但少数从右往左结合,比如赋值操作符=,具体的可查表,这里不再阐述

记住括号优先级最高,其次有自增自减操作符++和--,单目操作符+和-(决定数字正负)。

逗号表达式优先级最低,其次是赋值操作符。

注意:表达式的执行顺序可以被确定,但值的调用顺序不确定,所以当一个表达式中调用的值多次变化时会导致计算结果不确定。

如(i++)+(i++)+(i++)这个表达式的值在不同编译器下有不同解,因为i的调用可能是在++前,也可能是在++后

(6)整型提升(类型小于整型)和算术转换(类型大于整型且类型不同)

缺省整型指的是默认整型int

char中也可以存储数字,字符也是属于整型家族的,可以进行整型运算,只是能存储的大小很有限,你可以把它理解成更短的整型,取值是-128~127

有符号数的整型提升是按符号位提升,因此负数的整型提升补的全是1而不是0,char也有有无符号之分,但默认是不是有符号char得看系统,这个标准没有被定义。

注意整型提升以及之后参与运算的是补码,使用printf打印%d也会发生整型提升,是先提升补码,再转换为原码打印。

算术转换

当int和float相加时,int向float转换(向上转换)后再相加,加后存储的值仍为float类型

一般来说,算术转换的趋势是整型向浮点型转换,由字节少的类型向字节多的类型转换

进制转换总结(C++) 输出的话,我们选择一个字符数组或者整型数组(比如十六进制涉及‘A','B','C','D','E','F'可以使用字符数组,当然也可以选择使用整型数组先存储,等到输出时再将整数输出为对应的A,B,C,D,E,F即可,而二进制则只涉及0,1,可以使用整型数组)。需要知道0~9数字的ASCII码是连续的,A~Z大写字母的ASCII码是连续的, a~z小写字母的ASCII码是连续的。后面输出就将非'\0'输出即可。} //************有更好的写法。//*****************有更好的写法。 阅读详情

相关推荐

C++ sleep相关延时函数

C++ sleep相关延时函数

Han同学 3644

探索C/C++ 进制转换之美:从原理到应用

探索C/C++ 进制转换之美:从原理到应用

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 2039

进制转换在C/C++/Java/Kotlin中的应用(详细版)

本文详细的学习进制转换的基础,包括进制直接的计算,常见语言的函数转换,重点学习位运算和计算,最后以2个实际工作例子结尾。

我其实什么都不会 1147

C/C++相关概念和易错知识点(1)(IDE、关键字、转义字符)

这段代码很有意思,可以帮助我们理解\0和printf,我第一次只想打印arr1,但你仔细看就发现在一堆“烫”的乱码后跟着arr2的字符,说明printf不遇到\0就不会停,会一直访问内存并打印,在这里printf一直访问到我创建的arr2后面隐藏的的\0才停下来。其次,这些知识点是从我自己的角度出发整理的,因此我认为的重点可能和你不同,有的内容可能不完整或有错误,希望大家多多包涵,如果能指出我的错误,我会非常感激!\xyy:这里yy表示十六进制数字,前面的x是十六进制的标志,必须写,如\xa表示10。

SGlow0708的博客 277

【华为机试题分析-C/C++】知识点分类总结

常规的面试题考察主要是集中在字符串,数组和队列字符串

CodeAllen嵌入式 1202

C语言 进制转换为 进制 C/C++:详解与源代码

无论是将十进制数转换为其他进制,还是将其他进制的数转换为十进制,我们可以根据不同的需求选择合适的方法进行转换。无论是将十进制数转换为二进制、八进制或十六进制,还是将其他进制的数转换为十进制,掌握进制转换的方法是非常重要的。接下来,我们来看如何将其他进制(二进制、八进制和十六进制)的数转换为十进制。首先,我们来看如何将一个十进制数转换为其他进制(二进制、八进制和十六进制)。,分别用于将二进制、八进制和十六进制的数转换为十进制。这些函数使用迭代的方式进行转换,并返回转换后的十进制数。

PixelProX的博客 106

进制之间的转换——n进制转换为m进制(C/C++实现,简单易懂)

进制之间的转换——n进制转换为m进制(C/C++实现,简单易懂)。将从零基础开始讲解,带你全方面了解进制转换,含有例题,更好的帮助你理解。

jupangMZ的博客 5122

DeepSeek安装教程

两分钟讲述deepseek正确安装教程

weixin_45906703的博客 1662

掌握操作符(一):操作符的分类,二进制和进制转换,原码、反码、补码,移位操作符,位操作符:&、| 、^ 、~,单目操作符,逗号表达式,下标访问[ ]、函数调用()

掌握分支与循环(一):if语句、三种操作符、switch语句掌握分支循环(二):三种循环、break和continue语句、循环的嵌套以及 goto 语句掌握数组:一维数组、二维数组、变长数组及简单的二分查找掌握函数(一):库函数与自定义函数、形参与实参、return语句掌握函数(二)嵌套使用与链式访问以及函数的声明与定义。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1141

华中农业大学C++考试基础练习题

实验一 1 通过日期求某月的天数。 输入日期的年份和月份,求该月有多少天。提示:对于月份为1、3、5、7、8、10、12的月份天数为31,月份为4、6、9、11的月份天数为30,月份为2时要结合年份考虑闰年的情况。 输入描述 输入两个正整数y和m分别表示年份和月份。 输出描述 如果y和m满足条件:1900<=y<3000,0<m<13,输出该月的天数;否则输出“Input error!”。 输入样例 2010 12 输出样例 31 #include"iostream" using n

雨的博客 1万+

使用【阿里云百炼】搭建自己的大模型

本文介绍阿里云百炼大模型平台,其为企业级服务平台,融合通义千问等模型,支持多模态能力,提供一站式工具降低开发门槛。重点讲解智能体应用及大模型搭建步骤,含进入创新应用界面、选模型配参数、输指令、导数据、加载知识库、获取API Key、加样例库、配置MCP,还提及模型调试与多平台发布,并附试用链接,助力企业与开发者快速搭建适配业务的AI模型。

Larry的博客 4738

C++基础之操作符详解

8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的⼆ 进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀ 个8进制位,剩余不够3个2进制位的直接换算。⽐如 f 的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进 制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。如:2进制的 01101011,换成8进制:0153,0开头的数字,会被当做8进制。

2401_87353862的博客 877

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统

根据牛顿的观点,机械系统的动力学是二阶的(其状态由位置向量 q(也称为配置向量)和速度向量以及(可能还有)时间给出。二阶控制动力系统的一般形式是:其中 u 是控制向量。定义 1.1 (欠驱动控制微分方程) 二阶控制微分方程描述如下:在状态和时间 t 中,如果所得到的映射是可射的:对于每一个,都存在一个能产生预期响应的,那么系统就是全驱动的。否则,就是欠驱动(状态在时间 t)。

机器人控制与仿真应用 3377

蓝桥杯知识点总结C++ B组

虽然目前距离蓝桥省赛仅仅过去一天但昨天下午和大神对答案的感觉依旧… 现在深刻里理解到了为啥大神老是说咱们蓝桥叫 阅读理解杯(现在我非常认同这种说法啊…) 虽然第一次参加,赛前紧张提前30分钟入场,当认真做题的时候就真的忘记自己还在紧张…(感觉紧张可以忽略不计了) 28日出成绩了竟然是二等奖…有点小激动虽然这个含金量很少…一直觉得不是三等就是优秀… 第十届山东省赛(C++/C B组) 第一题 …(答...

MaxVen 7106

SAP Integration Suite 与 SAP Cloud Integration 的关系解析

SAP Cloud Integration是SAP Integration Suite套件的核心组件,专注于消息与流程集成。两者关系可概括为:Integration Suite是SAP BTP上的集成平台套件(iPaaS),而Cloud Integration是其中负责应用与B2B集成的关键能力。日常所说的"CPI"实际指代的是Integration Suite中的Cloud Integration功能。该套件还包含API管理、事件网格等其他集成能力,共同构成企业集成解决方案。理解这一层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 592

多层环境室内定位系统综述总结

本文是一篇发表于2025年《IEEE Access》期刊的综述论文,由埃及开罗美国大学与卡塔尔卡内基梅隆大学团队合作完成,聚焦多层环境室内定位系统的核心挑战、技术方案及未来方向,填补了该领域缺乏全面综述的空白。

程序员石磊 443

【C++】进制转换

相信在这节课开始之前,很多同学们早就对进制和进制转换比较熟悉了。我们本节课先通过一个利用栈来实现进制转换的例子,带大家再深入的学习下进制和进制转换。 例题1:将一个十进制数n转换为二进制数。 解题思路:十进制数转换成二进制数,可以采用辗转相除、取余数的方法得到。例如十进制数11转换成二进制。先求余数11%2=1,求商11/2=5,然后再用商5再求其余数,求其商,直到商为0,结束。 11%2=1 11/2=5 5%2=1 5/2=2 2%2=0 2/2=1 1%2=1 1/...

10247D的博客 1450

ROS入门教程(七)—— Gazebo与RViz联合仿真

通过Gazebo与RViz联合仿真实现机器人运动。

吾门的博客 1万+

C/C++语言100题练习计划 90——10 进制转 x 进制(进制转换实现)

C/C++语言100题练习计划 90——10 进制转 x 进制(进制实现)

Code_流苏:在代码中寻诗意,在实践中觅真知 1190

Python控制TEMI1000/TEMI1500测试温箱

该温箱是我司从昆山振弘检测设备有限公司采购的TEMI 1000,但是控制器用的是韩国的,关于控温箱这个项目,可参考的资料仅有一份官方的manual,里面包含一些命令格式。只要你有温箱,就应该可以向厂家索取该文档。该温箱的通讯接口只有一个RS232接口,要想实现远程控制,需要有串口转USB的线;类似于下图所以,想依靠python来与之进行通信,还是要通过python 的pyserial库,关于怎么安装pyserial,过于简单,这里不做赘述,可自行百度。

xgh1951的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C/C++ printf/cout格式化输出相关合集

当需要输出浮点数时保留小数点后面几位数,以十六进制输出整数,输出整数时按几个数字的宽度输出,宽度不足时左边(默认)/右边补“0”,等等。C语言中的 printf() 函数使用以%);C++中的 cout 对象则使用格式控制符(流操作算子)或者成员函数进行控制。使用格式控制符(.c) CC++流操纵算子可以用来干什么?使用流操作算子关于SETW

qq_36001281的博客 2200

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

跟我学C++中级篇——进制转换

本文介绍了计算机中常用的进制及其转换方法。计算机内部使用二进制(0和1),但实际应用中多采用十六进制简化表示,十进制则用于人机交互。文章详细说明了二进制、八进制、十进制和十六进制的特点及应用场景,并重点阐述了进制转换的必要性。通过C++示例代码展示了进制转换的实现方式,包括手动转换、STL流操作和使用bitset等方法。最后强调在不同应用场景中选择合适的进制表示,并注意转换过程中的数据类型处理,以避免计算错误。

fpcc的专栏 1114

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

c c++进制转换方法汇总(含全部代码)

ToAll() 十进制转任意进制 调用函数Itoa,自带的itoaToDecimal(string &S) 任意进制转十进制函数 调用Atoi函数,strtol函数ZhiDing() 作用:利用std的hex dec 以及 bitset,c语言的%o,%xStream() 作用:利用sstream头文件将数按某进制读入流,输出流。

2401_87256526的博客 4434

操作符整理——C语言

计算机中二进制存储及处理;操作符内容整理

m0_71429662的博客 189

C/C++知识点整理(3)

1. C++中构造函数和析构函数可以抛出异常吗? A.都不行B.都可以C.只有构造函数可以D.只有析构函数可以答案:C构造函数尽量不抛异常,析构函数不要抛异常。 对于构造函数: 在构造函数中抛出异常,将导致正在构造的对象的析构函数不会被执行。当对象发生部分构造时,已经构造完成的子对象将被逆序的析构(即异常发生点前面的对象),而还没有开始构造的子对象将不会被构造了(即异常发生点后面的对象),但正在

_今已亭亭如盖矣 1043

操作符义初解详,运算开篇韵悠长

大家好,这里是小编的博客频道很高兴在优快云这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!操作符的分类、⼆进制和进制转换原码、反码、补码、移位操作符、位操作符、单⽬操作符、逗号表达式那接下来就让我们开始遨游在知识的海洋!

实事求是,追求技术,精益求精~将至而立之年,不忘年少初心! 1273
上一篇: C/C++相关概念和易错知识点(2)(负数取模、左右移)
下一篇: C/C++相关概念和易错知识点(4)(指针与内存)
-SGlow-
博客等级 码龄3年 1513粉丝 118原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值