操作符讲解

目录

二进制和进制转换

原码、反码、补码

移位操作符

位操作符

一道面试题:

练习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.mfbz.cn/a/354379.html

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

相关文章

༺༽༾ཊ—Unity之-03-建造者模式—ཏ༿༼༻

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒&#xff08;个人喜好&#xff09; 任务&#xff1a;使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…

IndexedDB入门

https://www.cnblogs.com/zhangzuwei/p/16574791.html 注意 1.删除表&#xff0c;创建表只能在数据库版本升级里面进行。 2.keypath: key 要和表字段对应&#xff0c;而且格式要一样&#xff0c;不然不运行不报错。 3.使用 autoIncrement: true 代替 keypath: key&#xff…

C++ 数论相关题目 扩展欧几里得算法(裴蜀定理)

给定 n 对正整数 ai,bi &#xff0c;对于每对数&#xff0c;求出一组 xi,yi &#xff0c;使其满足 aixibiyigcd(ai,bi) 。 输入格式 第一行包含整数 n 。 接下来 n 行&#xff0c;每行包含两个整数 ai,bi 。 输出格式 输出共 n 行&#xff0c;对于每组 ai,bi &#xff0c;求…

实验5:冒泡法排序

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 3、实验要求&#xff1a; 4、程序流程图&#xff1a; 5、实验源程序&#xff1a; 6、实验要求分项截图及结果分析&#xff1a; 1、实验目的&#xff1a; 通过冒泡法排序程序设计&#xff0c;掌握将多重循环程序设…

技术书评和笔记【01】脑机接口-电路与系统 【2020版】

前言: 荷兰作者,Amir Zjajo博士,毕业于荷兰代尔夫特理工大学,方向 面向移动健康的低功耗混合型号电路与系统,以及,面向认知的神经形态电路。 ,脑机接口 - 电路与系统一书,系统介绍了,脑机接口电路与系统的实现技术,尤其,提到了量产和设计的问题,难能可贵,摘录如…

浪潮信息集中式存储仪电云云操作系统兼容性良好 通过澎湃技术认证

日前&#xff0c;浪潮信息集中式存储与仪电云i-stack云操作系统软件完成澎湃技术认证。在兼容性测试认证中&#xff0c;双方均表现出良好的兼容性能&#xff0c;同时系统运行可靠稳定&#xff0c;功能及性能表现俱佳。 浪潮信息澎湃技术认证是浪潮信息基于自身多元、创新的通用…

实际项目中的SpringAOP实现日志打印

目录 一、AOP实现日志 1.1 需求分析&#xff1a; 1.2 定义切面类和切点&#xff1a; 扩展&#xff1a;finally中的代码块一定会执行吗&#xff1f; 扩展 总结 1.3 定义环绕通知 1.4 handleBefore 的具体实现 1.4.1 获取url 1.4.2 获取接口描述信息 1.4.3 后续获取 1.5…

二叉树|116.填充每个节点的下一个右侧节点指针 117. 填充每个节点的下一个右侧节点指针 II

116.填充每个节点的下一个右侧节点指针 题目&#xff1a; 给定一个完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next …

CIFAR-10数据集详析:使用卷积神经网络训练图像分类模型

1.数据集介绍 CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成&#xff0c;每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。 数据集分为5个训练批次和1个测试批次&#xff0c;每个批次有10000张图像。测试批次正好包含从每个类中随机选择的 1000 张图像…

如何在AirPods Pro中使用降噪功能?这里提供几个方法

本文介绍了如何在AirPods Pro上使用降噪功能&#xff0c;如何关闭它&#xff0c;以及该功能的工作原理。 注意&#xff1a;AirPods Pro和AirPods Max支持噪音消除。你的设备必须运行iOS 13.2或iPadOS 13.2或更高版本才能使用降噪功能。 如何在AirPods Pro上打开降噪功能 Air…

CSS color探索

CSS 颜色探索 在 CSS 的世界里&#xff0c;颜色为网页元素赋予了丰富的视觉效果。通过预定义的颜色名称、RGB、HEX、HSL&#xff0c;以及支持透明度的 RGBA 和 HSLA&#xff0c;我们可以创造出各种吸引人的设计。接下来&#xff0c;我们将通过示例代码来深入了解这些颜色应用。…

重构改善既有代码的设计-学习(六):处理继承关系

1、函数上移&#xff08;Pull Up Method&#xff09; 无论何时&#xff0c;只要系统内出现重复&#xff0c;你就会面临“修改其中一个却未能修改另一个”的风险。通常&#xff0c;找出重复也有一定的难度。 所以&#xff0c;某个函数在各个子类中的函数体都相同&#xff08;它们…

MYSQL中group by分组查询的用法详解(where和having的区别)!

文章目录 前言一、数据准备二、使用实例1.如何显示每个部门的平均工资和最高工资2.显示每个部门的每种岗位的平均工资和最低工资3.显示平均工资低于2000的部门和它的平均工资4.having 和 where 的区别5.SQL查询中各个关键字的执行先后顺序 前言 在前面的文章中&#xff0c;我们…

指针的深入了解2

1.const修饰指针 在这之前我们还学过static修饰变量&#xff0c;那我们用const来修饰一下变量会有什么样的效果呢&#xff1f; 我们来看看&#xff1a; 我们可以看到编译器报错告诉我们a变成了一个不可修改的值&#xff0c;我们在变量前加上了const进行限制&#xff0c;但是我…

深入理解与防范C语言中的栈溢出问题

一、引言 栈溢出是计算机安全领域中一个常见的漏洞&#xff0c;特别是在C语言编程中。由于C语言的灵活性和对内存管理的直接操作性&#xff0c;如果程序员在编写代码时不注意&#xff0c;就可能导致栈溢出的发生。本文将全面解析栈溢出的概念、原因、影响以及防范措施。 二、…

绘制太极图 - 使用 PyQt

大家好&#xff01;今天我们将一起来探讨一下如何使用PyQt&#xff0c;这是一个强大的Python库&#xff0c;来绘制一个传统的太极图。这个图案代表着古老的阴阳哲学&#xff0c;而我们的代码将以大白话的方式向你揭示它的奥秘。 PyQt&#xff1a;是什么鬼&#xff1f; 首先&a…

嵌入式——窗口看门狗(WWDG)补充

目录 一、独立看门狗与窗口看门狗 1.功能描述 2.两者区别 二、WWDG功能描述 1.窗口看门狗时钟 2.计数器时钟 3. 计数器 4.窗口值 三、WWDG超时时间 一、独立看门狗与窗口看门狗 1.功能描述 STM32有两个看门狗&#xff1a;一个是独立看门狗&#xff08;IWDG&#xff0…

【GPU】GPU 硬件与 CUDA 程序开发工具

GPU 硬件与 CUDA 程序开发工具 笔记内容来自&#xff1a;《CUDA 编程&#xff1a;基础与实践》—樊哲勇 著 本文目录 GPU 硬件简介CUDA 程序开发工具CUDA 开发环境搭建用 nvidia-smi 检查与设置设备CUDA 的官方手册 GPU 硬件简介 GPU 是英文 graphics processing unit 的首字母…

【GitHub项目推荐--基于 AI 的口语训练平台】【转载】

Polyglot Polyglot 是一个开源的基于 AI 的口语训练平台客户端&#xff0c;可以在 Windows、Mac 上使用。 比如你想练习英语口语&#xff0c;只需在该平台配置一个虚拟的 AI 国外好友&#xff0c;你可以通过发语音的方式和 AI 好友交流&#xff0c;通过聊天的方式提升你的口…

黑马程序员——html css基础——day05——盒子模型

目录&#xff1a; 选择器 结构伪类选择器:nth-child(公式)伪元素选择器PxCook盒子模型 盒子模型-组成边框线 四个方向单方向边框线内边距尺寸计算外边距版心居中清除默认样式元素溢出外边距问题 合并现象外边距塌陷行内元素–内外边距问题圆角盒子阴影&#xff08;拓展&#x…