C语言程序设计——数学运算

news2024/12/29 10:20:25

基本运算符

运算符说明例子
=赋值运算符a = b;
+、-、*、/、()基本四则运算a = (a + c) * d;
%取余运算符a = b % 2
&、^、~、l位运算a = ~b l c
>>、<<左移和右移a = b >> 2

在c语言的数学运算中,所涉及到的符号如图所示,在使用过程中应该了解的就是各个符号在同一条语句中的优先级,以及在现实中很少用到的取余运算符的作用。

位运算

个人认为对于位运算的理解很大程度上能够帮助理解计算机的逻辑,所以单独讲一下,以及相关符号的使用。

在计算机中,所有的命令都是0、1来表示的,它代表的是两种情况。我们传输数据是通过电信号来传播的,那么高电平代表1,低电平代表0。从物理上来讲这是最容易实现的传输方式。我印象中在高中物理中也有过类似的扩展,开关的"打开"与"闭合两种状态",假如说有8盏灯来传递我们的信号,那么根据特定排列方式,选择我们需要传递的数字,按照这个数字闭合和打开开关就好了。
全闭合状态是0000 0000
如果我们想要传递一个13,以二进制的传递的话就是0000 1101。只需要闭合这三盏灯的开关,使其亮起,我们就可以接收到传递的信号是13.计算机内部同理。

二进制与十进制

以125为例子
十进制: 1 ∗ 1 0 2 + 2 ∗ 1 0 1 + 5 ∗ 1 0 0 1 * 10^2 +2*10^1+5*10^0 1102+2101+5100
二进制: 1 ∗ 2 6 + 1 ∗ 2 5 + 1 ∗ 2 4 + 1 ∗ 2 3 + 1 ∗ 2 2 + 0 ∗ 2 1 + 1 ∗ 2 0 = 64 + 32 + 16 + 8 + 4 + 1 1*2^6 + 1 * 2^5 +1*2^4+1*2^3+1*2^2+0*2^1+1*2^0 =64+32+16+8+4+1 126+125+124+123+122+021+120=64+32+16+8+4+1
其中十进制的10与二进制中的2叫做位权,那么不同进制间的转换就是位权的变换,他们本身的数值不会发生转换。如果不熟练,就找几个数字多练习几次就很好理解了。

与运算:当进行位运算时,都为1时,结果才为1,出现0结果则为0。就好像我们是同一根电线上的两个开关,只有当我们都闭合的时候,才能通电,一个是打开状态都不可以。在位运算当中,每一个开关都只与自己所处电线的开关进行计算(如下图)。

在第一个例子中5=>101,7=>111。按位进行与运算,两个二进制数中,5的第二位是0所以最后结果也就是101也就是5。
第二个例子中,7=>111,23=>10111。发现23的二进制位要多于7,这个情况下就在111前面补0,然后进行按位与运算
在这里插入图片描述

或运算:与运算你与我都为1结果为1,那么或就是你或我为1,结果就为1.与运算就相当于串联,或运算就相当于并联。
在这里插入图片描述
非运算:可以理解为按位取相反,0的位变成1,1的位变成0。在之前的循环读入中已经接触过了。但是需要一提的是,要注意数据类型的位数,同时在取反的时候符号位也会取反。这里没有把全部位都显示出来。
在这里插入图片描述

异或运算

异或可以理解为理解为一种逆运算,就像a + b = c,那么b = c - a。异或的运算方式为相同为0,不同为1,为什么他是逆运算呢,5^7 = 2, 2^5 = 7,2^7 = 5。也就是两个数异或之后得出来的数,再与原任意一个数异或可以得出另外一个数字。
在这里插入图片描述

小练习

写一个函数,函数功能为交换两个变量的值。

这道题的一般思路就是创建一个临时变量,存储原值,然后再相互赋值完成交换,但是当我们了解了异或之后,完全不用创建中间变量来存储。

#include<stdio.h>

int swap(int *a, int *b){
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;
	return 0;
}
int main(){
	int a = 2, b = 3;
	printf("a = %d, b = %d\n", a , b);
	swap(&a,&b);
	printf("a = %d, b = %d\n", a , b);
}

在这里插入图片描述
左移“<<”和右移“>>”
顾名思义左移就是把整个二进制数据向左移动,右移就是向右移动。左移右移是二进制环境下进行的,我们假设在十进制环境中163,左移一位就是1630,右移就是16.3下取整就是16。十进制中左移就是乘以10,右移就是除以10。二级制与十进制的区别就是位权发生了变化,那么在计算机中的二进制环境下左移就是乘以2,右移就是除以2(同样也是下取整)。
在这里插入图片描述

数学函数库

头文件: math.h

常用函数常用函数
pow(a,b)fabs
sqrt(n)log(n)
ceil(n)log10(n)
floor(n)acos(n)
abs(n)(stdlib.h)

pow()函数

pow()函数:指数函数
	头文件:math.h
	原型: double pow(double a, double b)
	a:底数
	b:指数
	返回值:a的b次幂
	例子:pow(2,3) = 8

sqrt()函数

sqrt()函数:平方根函数
	头文件:math.h
	原型: double pow(double x)
	x:被开方数
	返回值:x的平方根
	例子:sqrt(16) = 4

ceil()函数

ceil()函数:上取整函数
	头文件:math.h
	原型: double ceil(double x)
	x: 某个实数
	返回值:|x|
	例子:ceil(4.1) = 5

floor ()函数

floor()函数:下取整函数
	头文件:math.h
	原型: double floor(double x)
	x:某个实数
	返回值:|x|
	例子:floor(5.9) = 5

abs()函数

abs()函数:绝对值函数
	头文件:stdlib.h
	原型: int abs(int x)
	x:某个实数
	返回值:|x|
	例子:abs(-5) =5 

fabs()函数

fabs()函数:实数数绝对值函数
	头文件:math.h
	原型: double fabs(double x)
	x: 某个实数
	返回值:|x|
	例子:fabs(-4.9) = 4.9 

log()函数

log()函数:对数函数
	头文件:math.h
	原型: double log(double x)
	x:某个实数
	返回值:以e为底的x的对数
	例子:log(9) = 2.197225...

log10()函数

log10()函数:对数函数
	头文件:math.h
	原型: double log10(double x)
	x:某个实数
	返回值:以10为底的x的对数
	例子:log10(1000) = 3

可以通过换底公式求得不同的对数 l o g 2 6 = l o g 10 6 l o g 10 2 log_26 = \frac{log_{10}6}{log_{10}2} log26=log102log106

acos()函数

acos()函数:对数函数
	头文件:math.h
	原型: double acos(double x)
	x:某个实数
	返回值:返回arccos(x)
	例子:acos(-1) = 3.1415926...

写一个程序,输入一个数字,输出一个数字的立方根。
这道题需要注意的是,函数的数据类型是double。
在这里插入图片描述

拓展

在上面交换两个变量的值的问题中还可以采用宏的方式。这个采用的思路就是使用中间变量的方式,宏的好处就是运算速度更快,当然也可以在宏当中采用异或的方法。在这里主要是想多展示一下__typeof(),它实际上是内置的一个宏,就是参数的数据类型。
另外就是我们应该也更多的取了解宏的用法。
在这里插入图片描述

取余运算

取余运算在计算机当中最慢的运算,我们可以根据位运算的特性来进行优化。
%2 = n&1
对二取余的话,余数只可能是为1的,至于最后一位相关,所以与1操作就只是关注最后一位的情况
那么同理如果我们对4取余的话,那么就是和最后两位相关,就是&3。

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

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

相关文章

超简单的详细教程:如何为一个GitHub开源项目做出贡献!

仓库&#xff1a;Ai-trainee/GPT-Prompts-Hub 让我们通过一个具体的例子&#xff0c;详细了解如何从克隆一个GitHub仓库开始&#xff0c;一步步地贡献到一个项目。以下是详细步骤&#xff0c;包括所需的代码和说明&#xff1a; 首先我们Fork想要贡献的项目&#xff0c;然后请看…

Vite scss 如何引入本地 字体

Vite scss 如何引入本地 字体 最近在用 Vite 改造一个旧项目 Diary&#xff0c;遇到了好多从 Vue 转到 Vite 的问题。 这次这个问题是&#xff1a; scss 里本地字体引入的问题。 一、问题描述 可以看到下面的卡片字体&#xff0c;本来应该是 impact 的&#xff0c;但现在无法…

KBDSL1.DLL文件丢失,软件或游戏无法启动,快速修复方法

在Windows操作系统中&#xff0c;KBDSL1.DLL是一个动态链接库文件&#xff0c;由Microsoft Corporation提供。通常包含多个函数和程序&#xff0c;可以被多个应用程序共享&#xff0c;以执行一些特定的任务或功能。 如果KBDSL1.DLL文件丢失或损坏&#xff0c;可能会在启动计算机…

金和OA C6 UploadFileEditorSave.aspx 任意文件上传漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA C6 uploadfileeditorsave接口处存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊…

vmware中ubuntu虚拟机不能够用共享文件夹

有时候发现装好虚拟机后&#xff0c;然后 虚拟机-设置-选项-共享文件夹 然后使用快捷键ctrlaltt 打开命令行&#xff0c;cd /mnt下没有看到hgfs文件夹 解决办法是安装vmware tools工具 此时想通过点击 虚拟机-安装vmwaretools工具 按钮 居然发现该按钮是灰色的&#xff0…

Note: A Woman Doctor Lina

A woman doctor Lina 女医生丽娜 Born in a pigs’ nest, Lina led a poor life in her childhood. 出生在猪圈里&#xff0c;丽娜过着贫穷的童年生活。 led nest She was looked down upon by the children of her generation. 她被她同时代的孩子瞧不起。 generation look…

Python爬虫中的协程

协程 基本概念 协程&#xff1a;当程序执行的某一个任务遇到了IO操作时&#xff08;处于阻塞状态&#xff09;&#xff0c;不让CPU切换走&#xff08;就是不让CPU去执行其他程序&#xff09;&#xff0c;而是选择性的切换到其他任务上&#xff0c;让CPU执行新的任务&#xff…

QtApplets-SystemInfo

QtApplets-SystemInfo ​ 今天是2024年1月3日09:18:44&#xff0c;这也是2024年的第一篇博客&#xff0c;今天我们主要两件事&#xff0c;第一件&#xff0c;获取系统CPU使用率&#xff0c;第二件&#xff0c;获取系统内存使用情况。 ​ 这里因为写博客的这个本本的环境配置不…

C++学习day--25 俄罗斯方块游戏图像化开发

项目分析 项目演示、项目分析 启动页面 启动页面&#xff1a; 分析&#xff1a; 开发环境搭建 1&#xff09;安装vc2010, 或其他vs版本 2&#xff09;安装easyX图形库 代码实现: # include <stdio.h> # include <graphics.h> void welcome(void) { initgraph(55…

【MySQL】MySQL如何查询和筛选存储的JSON数据?

MySQL如何查询和筛选存储的JSON数据&#xff1f; 一、背景介绍二、支持的JSON数据类型三、基础数据3.1 创建表3.2 插入 JSON 数据3.3 查询 JSON 数据 四、操作函数4.1 JSON_OBJECT4.2 JSON_ARRAY4.3 JSON_EXTRACT 一、背景介绍 JSON(JavaScript Object Notation)是一种轻量级的…

如何通过内网穿透实现无公网IP远程访问内网的Linux宝塔面板

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

dubbo的基础知识

dubbo是什么 Dubbo是一个分布式服务框架&#xff0c;是一种高性能的远程通讯框架。它提供了基于Java的RPC&#xff08;远程过程调用&#xff09;通信机制&#xff0c;使得应用之间可以方便地进行远程调用&#xff0c;实现分布式服务的调用和管理。Dubbo提供了服务注册、发现、负…

轻松获取CHATGPT API:免费、无验证、带实例

免费获取和使用ChatGPT API的方法 快速开始&#xff1a;视频教程 章节一&#xff1a;GPT-API-Free开源项目介绍 GPT-API-Free 是一个开源项目&#xff0c;它提供了一个中转API KEY&#xff0c;使用户能够调用多个GPT模型&#xff0c;包括gpt-3.5-turbo、embedding和gpt-4。这…

cesium键盘控制模型

效果&#xff1a; 由于对添加模型和更新位置api进行二次了封装&#xff0c;下面提供思路 1.添加模型 const person reactive({modelTimer: null,position: {lon: 104.07274,lat: 30.57899,alt: 1200,heading: 0,pitch: 0,roll: 0,}, }); window.swpcesium.addEntity.addMo…

8.1分发饼干(LC455-E)

算法&#xff1a; 局部最优&#xff1a;大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子&#xff0c;那么就应该优先满足胃口大的。局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个。 全局最优&#xff1a;喂饱尽可能多的小孩。 为什么局部…

C++开发小技巧

C开发一些小技巧 积累一些能用得到的C开发小技巧。 错误码/状态码 错误码/状态码在项目很常见&#xff0c;用于提示错误类型、状态&#xff0c;通常还会附带一些相关描述。通常错误码是统一管理的&#xff0c;例如使用宏或者枚举定义。 平时我的做法 使用宏或者枚举定义错…

Redis缓存保卫战:拒绝缓存击穿的进攻【redis问题 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis缓存保卫战&#xff1a;拒绝缓存击穿的进攻 前言缓存击穿的定义和原理为何会发生缓存击穿缓存击穿的危害防范缓存击穿结语: 前言 你是否曾经遇到过系统在高并发情况下出现严重性能问题&#xff…

【ASP.NET Core 基础知识】--环境设置

一、简介 1.1 .NET Core SDK 概述 .NET Core SDK&#xff08;Software Development Kit&#xff09;是Microsoft推出的一个开源跨平台框架&#xff0c;用于开发和部署.NET应用程序。它是.NET Core平台的核心组件之一&#xff0c;为开发者提供了在多个操作系统上构建高性能、可…

ssm基于VUE的图书馆管理系统的设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#x…

imazing破解版百度云2.17.3(附激活许可证下载)

iMazing是一款强大的 iOS 设备管理软件&#xff0c;不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要将 iOS 设备连接到计算机&#xff0c;就可以处理不同类型的数据。 iPhone 和 iPad 备份 借助 iMazing 的独有 iOS 备份技术&#xff08;无线、隐私和自动&#xff09…