操作符讲解

news2024/12/23 9:27:01

目录

二进制和进制转换

原码、反码、补码

移位操作符

位操作符

一道面试题:

练习1:

思考题:

练习2:

逗号表达式

函数调用操作符()

结构成员访问操作符

结构体

操作符的属性:优先级、结合性

优先级:

结合性:


二进制和进制转换

  • 2进制转8进制

8进制的数字每一位是0~7,0~7的数字各自写成2进制,最多有3个2进制位就够了,比如7的2进制位是111,所以2进制转8进制的时候,从2进制序列中右边低位开始向左每3个2进制位换算成一个8进制位,剩余不够3个2进制位的直接换算

如:2进制的01101011,换成8进制0153,0开头的数字会被当作8进制

  • 2进制转16进制

16进制的数字每一位是0~9,a~f的数字,各自写成2进制,最多有4个2进制位就足够了,比如f的二进制是1111,所以2进制转16进制的时候,从2进制序列中右边低位开始向左每4个2进制位会换算一个16进制位,剩余不够4个二进制位的直接换算

如:2进制的01101011,换成16进制0x6b,16进制表示的时候前面加0x

原码、反码、补码

整数的2进制表示方法有三种,即原码、反码和补码

有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的一位被当做是符号位,剩余的都是数值位

符号位0表示正,1表示负

正整数的原、反、补码都相同

负整数的三种表示方法各不相同

对于整型来说,数据存放内存中存放的是补码;原因:在计算机系统中,数值一律用补码来表示和存储,使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码和原码相互转换,其运算过程是相同的(补码取反加一得到原码),不需要额外的硬件电路

移位操作符

  • 左移操作符:左边抛弃,右边补0
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 6;
	int b = (a << 1);
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

运行结果:

a本身不变

  • 右移操作符:

右移分两种:1.逻辑右移:左边用0填充,右边丢弃

                      2.算术右移:左边用原该值的符号位填充,右边丢弃(推荐)

位操作符

&按位与           &&逻辑与

|按位或              ||逻辑或

^按位异或:相同为0,相异为1

~按位取反         !逻辑取反

他们的操作数必须是整数 

一道面试题:

  • 最先想到的方法:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//不添加变量,实现两个数的交换
int main()
{

	int a = 1, b = 2;
	a = a + b;
	b = a - b;
	a = a - b;
	printf("a=%d,b=%d", a, b);
	return 0;
}

运行结果:

此方法有一个弊端,如果两个数很大,就超出了整型的范围

  • 用另一种方法(按位异或):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//不添加变量,实现两个数的交换
int main()
{

	int a = 1, b = 2;
	a = a ^ b;//a相当于一把钥匙,在b处找到a,在a处找到b
	b = a ^ b;
	a = a ^ b;
	printf("a=%d,b=%d", a, b);
	return 0;
}

运行结果:

代码分析:

1^1=0;

1^0=1;

b=a^b^b=a;

a=a^b^a=b;

实现了交换,也不会溢出;

练习1:

  • 编写代码实现:求一个整数存储在内存中的二进制中1的个数
  • 首先想到的方法:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	unsigned int n;//正负数都可以!
	scanf("%d", &n);
	int count = 0;
	while (n)
	{
		if (n % 2 == 1)
			count++;
		n /= 2;
	}
	printf("%d", count);
	return 0;
}

但是此方法如果不是unsigned,则不适用于负数

  • 另一种方法:
int main()
{
	unsigned int n;
	scanf("%d", &n);
	int count = 0;
	while (n)
	{
		if (n & 1 == 1)
			//如果一个数最后一位是1,则得到的数为1,否则为0;
			//逻辑与&
			count++;
		//n /= 2;//将最后一位去除,也就是右移一位,即,下面一句话
		n >>= 1;
	}
	printf("%d", count);
	return 0;
}
  • 另一种方法(不需要unsigned):(不在乎正负数)
int main()
{
	int n;
	int count = 0;
	scanf("%d", &n);
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if ((n >> i) & 1 == 1)
			count++;
	}
	printf("%d", count);
	return 0;
}
  • 还有一种方法,不易想到:

n=n&(n-1)//能将n的二进制中最右边的1去掉;

int main()
{
	int n;
	int count = 0;
	scanf("%d", &n);
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	printf("%d", count++);
	return 0;
}

思考题:

如何判断一个数是否是2的次方?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int n;
	scanf("%d", &n);
	if ((n & (n - 1) )== 0)
		printf("yes!");
	else
		printf("no!");
	return 0;
}

练习2:

二进制位置0或者置1

编写代码将n(例如13)的二进制序列的第5位修改为1,然后再改为0

先或后与

int main()
{
	int n;
	scanf("%d", &n);
	n |= (1 << 4);//把第5位改为1
	printf("%d\n", n);
	n &= (~(1 << 4));//把第5位改为0
	printf("%d", n);
	return 0;
}

逗号表达式

逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 1, b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);//a=12,b=12+1=13;
	printf("%d", c);//13
	return 0;
}

函数调用操作符()

函数调用操作符的参数至少为1个,如:

void test()
{
	printf("hehe\n");
}
int main()
{
	test();//1个参数
	return 0;
}

结构成员访问操作符

结构体

C语言中有了内置类型,如char,short,int,float,但只有这些是远远不够的,为了解决这一问题,增加了结构体这种自定义的数据类型,来创造出适合的类型

结构体关键字:struct

结构体是用来描述一个复杂对象,里面可以包含多个属性

结构体中涉及2个操作符:. 和 ->,也叫成员访问操作符

结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量,如:标量,数组,指针,甚至是其他的结构体

结构的声明:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct student
{
	char name[20];
	int age;
	int high;
	float weight;
	char id[16];//成员列表
}s4,s5,s6;//分号不能少
//s4,s5,s6是全局的结构体变量
struct student s7;//全局的
int main()
{
     struct student s1={"张三",18,180,75.5f,"2328202311"};//初始化
     struct student s2={.age=19,.name="李四",.weight=80.5,.high=177,.id="2328202312"};
     //结构体变量.成员名
     struct student s3;//局部的
     printf("%s %d %d %.1f %s\n",s1.name,s1.age,s1.high,s1.weight,s1.id);
}

操作符的属性:优先级、结合性

C语言的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序

优先级:

结合性:

如果两个运算符优先级相同,则需看结合性,根据运算符是左结合还是右结合,大部分运算符是左结合(从左到右执行)

圆括号()的优先级最高,可以使用它改变其他运算符的优先级

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C与C++相互调用的“底层原理“

在你的C语言代码中&#xff0c;不知能否看到类似下面的代码&#xff1a; 这好像没有什么问题&#xff0c;你应该还会想&#xff1a;“嗯⋯是啊&#xff0c;我们的代码都是这样写的&#xff0c;从来没有因此碰到过什么麻烦啊&#xff5e;”。 你说的没错&#xff0c;如果你的头…

CSDN·COC城市开发者组织2023年度聚会上海站纪实

目录 前言活动宣传活动议程活动总结结束语 前言 2023年是CSDNCOC成立之年&#xff0c;经过一年的不断发展和壮大&#xff0c;COC上海城市开发者社区的队伍不断壮大&#xff0c;本着每个月都有线下活动的原则&#xff0c;先后举办大大小小的线下沙龙活动20余场。与此同时&…

16. 输入设备应用编程

16. 输入设备应用编程 1. 输入类设备编程介绍1.1 什么是输入设备1.2 input 子系统1.3 读取数据的流程1.4 应用程序如何解析数据 2. 读取 struct input_event 数据3. 按键应用编程4. 触摸屏应用编程4.1 解析触摸屏设备上报的数据4.1.1 单点触摸设备——事件上报顺序4.1.2 多点触…

ARL灯塔vps云服务器安装

前提是vps服务器已经安装好docker 1、下载压缩包到本地 2、解除不能扫描edu等域名的限制 解压docker_arl.zip&#xff0c;打开docker_arl/config-docker.yaml文件 删除掉edu.cn等限制域名(图中已删除) 3、上传至vps云服务器 将docker_arl文件上传到云服务器opt目录下 这里我…

【开源之美】:cppcheck

一、项目链接 https://github.com/danmar/cppcheck/tree/main 二、效果示例

STM32 E18-D80NK红外避障传感器

E18-D80NK-N是一款红外光电传感器&#xff0c;它同时具备发射和接收功能。通过对发射光进行调制后发出&#xff0c;并通过接收头对反射光进行解调输出。 E18-D80NK-N采用了透镜来增强传感器的性能&#xff0c;使其能够检测更远的距离。根据红外光的特性&#xff0c;不同颜色的…

如何将前后端分离(vue2+SpringBoot)项目部署到腾讯云服务器

如何将前后端分离&#xff08;vue2SpringBoot&#xff09;项目部署到腾讯云服务器 目录 如何将前后端分离&#xff08;vue2SpringBoot&#xff09;项目部署到腾讯云服务器 1、在选中目录地下新建2个文件夹 2、将打包好的前端项目和后端jar包上传到相应的目录下 3、将路径切…

基于Prompt Learning的信息抽取

PTR: Prompt Tuning with Rules for Text Classification 清华&#xff1b;liuzhiyuan&#xff1b;通过规则制定subpromptRelation Extraction as Open-book Examination: Retrieval-enhanced Prompt Tuning Relation Extraction as Open-book Examination: Retrieval-enhance…

R语言【taxlist】——print_name():为发表文章准备可用的格式化名称

Package taxlist version 0.2.4 Description 在撰写关于生物多样性的文章时&#xff0c;可以使用名称自动插入到文件中&#xff0c;包括学名不同元素的典型斜体格式。函数print_name既可以应用于 Markdown 文档&#xff0c;也可以应用于图形。在 Rmarkdown 文档中&#xff0c;…

解决方案—幻兽帕鲁Palworld私服部署 一杯茶的功夫搭建部署一个属于自己的游戏私服

《幻兽帕鲁》是Pocketpair开发的一款开放世界生存制作游戏 &#xff0c;游戏于2024年1月18日发行抢先体验版本&#xff0c;游戏中&#xff0c;玩家可以在广阔的世界中收集神奇的生物“帕鲁”&#xff0c;派他们进行战斗、建造、做农活&#xff0c;工业生产&#xff0c;游戏目前…

重磅福利!23篇AI-Agents智能代理必读论文!不容错过!

会议之眼 快讯 在数字化时代&#xff0c;AI已经成为各行各业的驱动力&#xff0c;推动科技和社会快速发展。AI-Agents被称为“AI代理”或“智能代理”&#xff0c;是一项前沿应用。它们具备自主感知、决策和执行任务的能力。通过分析传感器信息或用户指令&#xff0c;AI-Agents…

一键去除视频水印,让你的视频更完美

你是否曾经因为视频中的水印而烦恼&#xff1f;现在&#xff0c;有了我们的视频剪辑工具&#xff0c;你可以轻松去除视频中的水印&#xff0c;让你的视频更加完美&#xff01;这款工具采用先进的视频处理技术&#xff0c;能够一键批量去除水印&#xff0c;让你的视频更加干净整…

【JavaScript基础入门】03 JavaScript 基础语法(一)

JavaScript 基础语法&#xff08;一&#xff09; 目录 JavaScript 基础语法&#xff08;一&#xff09;1. JS 初体验2. JavaScript注释2.1 单行注释2.2 多行注释 3. JavaScript结束符4. JavaScript输入输出语句 1. JS 初体验 JS 有3种书写位置&#xff0c;分别为内联、内部和外…

TBTOOLS标记染色体上的gene

最近碰到个问题&#xff0c;如何在染色体上标记gene, 查了下发现了个windows工具&#xff1a;TBTOOLs &#xff0c; 有点意思&#xff0c;真是简洁高效。 话不多说&#xff0c;直接干。。 工具下载 直接在github 下载即可 https://github.com/CJ-Chen/TBtools-II&#xff0c;…

【Java程序设计】【C00177】基于SSM的IT论坛管理系统(论文+PPT)

基于SSM的IT论坛管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的IT论坛管理系统 本系统分为前台系统、后台管理员、后台教师以及后台用户4个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0…

JavaScript定义变量及赋值

定义变量及赋值 ☞ 定义变量,未赋值var 变量名; 默认值是undefined ☞ 定义变量,且赋值var 变量名 数据;☞ 总结:1. 一个变量一次只能保存一个值&#xff1b;2. 以最后一次赋值为准3. JS变量区分大小写变量命名规范 ☞ 规则 必须遵守的&#xff0c;不遵守的话 JS引擎 发…

平安银行广州分行:用有温度的金融服务,实现健康与财富双重守护

甄选优质权益&#xff0c;守护客户身心健康   2024年1月&#xff0c;平安银行广州分行成功举办两场心理疗愈工作坊活动&#xff0c;旨在助力客户们摆脱工作和生活的喧嚣繁忙&#xff0c;在平静的疗愈气氛中拥抱自我、感受内心的平和。在“律动心弦-音乐疗愈工作坊”活动中&am…

C语言王道第八周一题

Description 初始化顺序表&#xff08;顺序表中元素为整型&#xff09;&#xff0c;里边的元素是 1,2,3&#xff0c;然后通过 scanf 读取一个元素&#xff08;假如插入的是 6&#xff09;&#xff0c;插入到第 2 个位置&#xff0c;打印输出顺序表&#xff0c;每个 元素占 3 个…

堆和堆排序【数据结构】

目录 一、堆1. 堆的存储定义2. 初始化堆3. 销毁堆4. 堆的插入向上调整算法 5. 堆的删除向下调整算法 6. 获取堆顶数据7. 获取堆的数据个数8. 堆的判空 二、Gif演示三、 堆排序1. 堆排序(1) 建大堆(2) 排序 2.Topk问题 四、完整代码1.堆的代码Heap.cHeap.htest.c 2. 堆排序的代码…

RT-Thread: STM32 SPI使用流程

1.添加驱动 ①点开设置界面 ②勾选看门 SPI 驱动 ③点击保存 ④查看添加的驱动文件 drv_spi.c 2.打开驱动头文件定义 ①打开配置文件 ②打开定义 3.打开需要开启的SPI总线 打开 drivers 目录下的 board.h 用SPI搜索&#xff0c;找到如下文字&#xff0c;打开对应的宏。 /*-…