C-操作符详解

1.进制转换

1.1 10进制转2进制

方法:短除法

1.2 2进制转换8进制

8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的⼆进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位,剩余不够3个2进制位的直接换算。
如:2进制的01101011,换成8进制:01530开头的数字,会被当做8进制。
我有一个问题:怎么区别 0111是8进制还是2进制?
1.3 2进制转换16进制
2进制转化16进制和2进制转换8进制十分相似,
16进制的数字每⼀位是0~9,a ~f 的,0~9,a ~f的数字,各⾃写成2进制,最多有4个2进制位就⾜够了,
⽐如 f 的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进
制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。
如:2进制的01101011,换成16进制:0x6b,16进制表⽰的时候前面加0x
2 原码,反码,补码
整数 的2进制表⽰⽅法有三种,即原码、反码和补码
有符号整数的三种表⽰⽅法均有符号位数值位两部分,2进制序列中,最⾼位的1位是被当做符号
位,剩余的都是数值位。
符号位都是⽤0表⽰“正”,⽤1表⽰“负”。
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
反码得到原码也是可以使⽤:取反,+1的操作
对于整形来说:数据存放中其实存放的是补码。
//操作符详解
#include<stdio.h>

int main()
{
	int num1 = 10;
	//10存放在整型变量num1中,占4个字节==32个bit位
	//0000 0000 0000 0000 0000 0000 0000 1010 -原码
	//0000 0000 0000 0000 0000 0000 0000 1010 -反码
	//0000 0000 0000 0000 0000 0000 0000 1010  -补码

	//正数的原码,反码,补码都一样
	int num2 = -10;
	//-10存放在整型变量num2中,占4个字节==32个bit位
	//1000 0000 0000 0000 0000 0000 0000 1010 -原码
	//1111 1111 1111 1111 1111 1111 1111 0101 -反码
	//1111 1111 1111 1111 1111 1111 1111 0110 -补码

	//负数的原码,反码,补码要经过计算
	return 0;
}

为什么计算机中存补码呢?

在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀ 处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
简单举个例子:
1-1
 1+(-1)
 0000 0000 0000 0000 0000 0000 0000 0001 -1的补码
 1111 1111 1111 1111 1111 1111 1111 1111 -(-1)的补码
 相加
1 0000 0000 0000 0000 0000 0000 0000 0000
 最高位被丢弃
 结果是0

3 移位操作符(移动的是补码)

3.1左移操作符

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

#include<stdio.h>

int main()
{
	int num = 10;
	int n = num << 1;
	printf("n= %d\n", n);
	printf("num= %d\n", num);
	return 0;
}

3.2 右移操作符

右移操作符比左移操作符稍微复杂一点。

首先他的移位规则就分为两种:
1. 逻辑右移:左边⽤0填充,右边丢弃
2. 算术右移:左边⽤原该值的符号位填充,右边丢弃

 应用哪种规则取决于编译器,目前大部分编译器上使用的算术右移,

#include <stdio.h>
int main()
{
	int num = -10;
	int n = num >> 1;
	printf("n= %d\n", n);//-5
	printf("num= %d\n", num);//-10
	return 0;
}
逻辑右移:
算术右移
警告⚠️:
对于移位运算符,不要移动负数位,这个是标准未定义的。
int num = 10;
num>>-1;//error

4. 位操作符:& | ^ ~

注意:他们操作的对象必须是整数

区别: && (逻辑与)||(逻辑或),他们是逻辑操作符

#include <stdio.h>
int main()
{
	int num1 = 3;
	//0000 0000 0000 0000 0000 0000 0000 0011  3的补码
	int num2 = -5;
	//1111 1111 1111 1111 1111 1111 1111 1011   -5的补码
	// 
	//按照(二进制)位进行运算

	printf("%d\n", num1 & num2);//3
	//& 有0就是0,全1为1
	//0000 0000 0000 0000 0000 0000 0000 0011

	printf("%d\n", num1 | num2);//-5
	//| 有1为1,全0为0
	//1111 1111 1111 1111 1111 1111 1111 1011   

	printf("%d\n", num1 ^ num2);//-8
	//^ 相同为0,相异为1
	//1111 1111 1111 1111 1111 1111 1111 1100

	printf("%d\n", ~0);//-1
	//~ 按位取反
	// 1111 1111 1111 1111 1111 1111 1111 1111 -(-1)的补码

	return 0;
}
拓展⾯试题:
不能创建临时变量(第三个变量),交换两个整数
方法:使用^ 
#include <stdio.h>
int main()
{
	int a = 10;
	//0000 0000 0000 0000 0000 0000 0000 1010
	int b = 20;
	//0000 0000 0000 0000 0000 0000 0001 0100  
	a = a ^ b;
	//a=
	//0000 0000 0000 0000 0000 0000 0001 1110
	//30
	b = a ^ b;
	//b=
	//0000 0000 0000 0000 0000 0000 0000 1010
	//10

	a = a ^ b;
	//a=
	//0000 0000 0000 0000 0000 0000 0001 0100  
	//20
	printf("a = %d b = %d\n", a, b);
	return 0;
}

练习1 :编写代码实现 :求一个整数存储在二进制中1的个数

int main()
{
	//方法1:&的应用
	int num =5;
	int i = 0; int count = 0;
	for (i = 0; i < 32; i++)
	{
		if (((num >> i) & 1) == 1)//不用考虑正负数,移位操作符移动的是补码
			count++;
	}
	printf("%d", count);
	return 0;
}

问题: 什么时候要考虑正负数嘞?

#include <stdio.h>

int count_one_bit(unsigned int n)
//int count_one_bie(int n) 针对负数就可能出错
{
	int count = 0;
	while (n)
	{
		if (n % 2 == 1)
			count++;
		n = n / 2;
	}
	return count;
}

方法3:

//最高效的一种
int count_one_bit(unsigned int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}

5. 单目操作符

单⽬操作符有这些:
!、 ++ -- & * + - ~ sizeof ( 类型 )

6.逗号表达式

逗号表达式,就是⽤逗号隔开的多个表达式。
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
7.下标访问[]、函数调⽤()
7.1 [ ] 下标引⽤操作符
操作数:⼀个数组名 + ⼀个索引值
int arr[10];//创建数组
arr[9] = 10;//实⽤下标引⽤操作符。
//[ ]的两个操作数是arr和9。

7.2 () 函数调用操作符
#include <stdio.h>
void test1()
{
 printf("hehe\n");
}
void test2(const char *str)
{
 printf("%s\n", str);
}
int main()
{
 test1(); //这⾥的()就是作为函数调⽤操作符。
 test2("hello bit.");//这⾥的()就是函数调⽤操作符。
 return 0;
}

8.结构体访问操作符

C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类
型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。
📌 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如: 标量、数组、指针,甚至是其他结构体
结构体声明
struct Stu
{
	char name[20];
	int age;
	float score;
}stu;//全局变量

结构体的使用

//结构体的声明
struct Stu
{
	char name[20];
	int age;
	float score;
}stu = {"Bob",18,97.5f};//全局变量的初始化

int main()
{
	//结构体变量的初始化
	struct Stu s1 = { "Mary",15,96.5 };//局部变量
	//结构体的直接访问
	printf("%s %d %lf\n", s1.name, s1.age, s1.score);
	printf("%s %d %lf\n", stu.name, stu.age, stu.score);
	//结构体的间接访问
	struct Stu* ps = &s1;
	printf("%s %d %lf\n", ps->name,ps->age,ps->score);
	return 0;
}

9. 操作符的优先级和结合性

9.1 优先级

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的。
1 3 + 4 * 5 ;
⾯⽰例中,表达式 3 + 4 * 5 ⾥⾯既有加法运算符( + ),⼜有乘法运算符( * )。由于乘法的优先级⾼于加法,所以会先计算 4 * 5 ,⽽不是先计算 3 + 4
9.2结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右结合(从右到左执⾏),⽐如赋值运算符( = )。
1 5 * 6 / 2 ;
上⾯⽰例中, * / 的优先级相同,它们都是左结合运算符,所以从左到右执⾏,先计算 5 * 6
再计算 6 / 2 。 运算符的优先级顺序很多,下⾯是部分运算符的优先级顺序(按照优先级从⾼到低排列),建议⼤概
记住这些操作符的优先级就⾏,其他操作符在使⽤的时候查看下⾯表格就可以了。
圆括号( ()
⾃增运算符( ++ ),⾃减运算符( --
单⽬运算符( + -
乘法( * ),除法( /
加法( + ),减法( -
关系运算符( < > 等)
赋值运算符( =
由于圆括号的优先级最⾼,可以使用它改变其他运算符的优先级。

C语言中,可以通过数字的前缀来区分二进制和八进制。如果一个数字以0开头,则表示它是八进制数;如果一个数字以0b或0B开头,则表示它是二进制数。

例如,对于数字0111,根据前缀0,它被视为八进制数。要将其转换为十进制数,可以使用C语言中的atoi()函数或strtol()函数。

下面是一个示例代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *binary = "0111";
    int decimal = strtol(binary, NULL, 8);
    
    printf("Decimal value: %d\n", decimal); // 输出:73
    
    return 0;
}

在上面的代码中,我们将字符串"0111"转换为八进制数73,并将其打印为十进制数

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

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

相关文章

三、Qt Creator 使用

关于Qt的安装及环境配置&#xff0c;在我的上一篇《二、QT下载、安装及问题解决(windows系统)》已经讲过了。 本章节有一个重点&#xff0c;在新建 工程文件时&#xff0c;所在路径不要有中文&#xff0c;否则编译及运行程序不能正常运行。 在使用Qt Creator&#xff08;以下…

A connection was successfully established with the server but then an error

在使用EFCore生成数据库的时候&#xff0c;报上面的错误&#xff01; 解决方法&#xff1a; 加&#xff08;EncryptTrue;TrustServerCertificateTrue;&#xff09;即可&#xff1a; "ConnectionStrings": { "DefaultConnection": "Data SourceLAP…

基于ssm运动器械购物商城+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本运动器械购物商城就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

MongoDB安装与基本使用

一、简介 1.1 Mongodb 是什么 MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 https://www.mongodb.com/ 1.2 数据库是什么 数据库&#xff08; DataBase &#xff09;是按照数据结构来组织、存储和管理数据的 应用程序 1.3 数据库的作用 数据库的…

Python基础知识:整理15 列表的sort方法

1 sorted() 方法 之前我们学习过 sorted() 方法&#xff0c;可以对列表、元组、集合及字典进行排序 # 1.列表 ls [1, 10, 8, 4, 5] ls_new sorted(ls, reverseTrue) print(ls_new) …

最新地图下载器(支持切片和矢量数据下载)

一、应用背景 在当今数字时代&#xff0c;地图下载器成为了越来越多人的必备工具。地图下载器可以帮助人们在没有网络的情况下使用地图&#xff0c;也可以帮助人们快速下载大量地图数据&#xff0c;方便日常生活和旅行。本文将介绍地图下载器的基本功能及其在不同场景下的应用。…

JVM运行时数据区(下篇)

紧接上篇&#xff1a;JVM运行时数据区&#xff08;上篇&#xff09;-CSDN博客 堆 一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。 栈上的局部变量表中&#xff0c;可以存放堆上对象的引用。静态变量也可以存放堆对象的引用&#xff0c;通过静态…

TikTok系列算法定位还原x-ss-stub

TikTok的x系列的算法比较有名,很多粉丝也问过,之前没有深入研究,本人工作量也比较大。 我们上次说到TikTok的x-ss-stub的算法就是ccmd5标准库算的,今天要讲细致点,表面这个结论本不是直接将数据md5那么来的,是经过一系列分析来的 上图是上次截图的,这次我们分析整个定位…

PostgreSQL autovacuum详解(自动化清理空间)

文章目录 1. 什么是autovacuum2. autovacuum的作用3. 如何开启autovacuum4. autovacuum相关参数4.1 触发条件4.2 参数建议4.3 更改系统autovacuum相关参数4.4 更改单表autovacuum相关参数 1. 什么是autovacuum PostgreSQL的autovacuum是一种自动化的维护工具&#xff0c;用于管…

Git相关3 —— 命令及添加Gitee的公钥

1.Git相关命令1 -- 工作目录、暂存区、本地仓库、 使用平台有&#xff1a;cmd、Git bash、VSCode window系统修改VSCode默认终端为git bash git init 初始化 --- 新增.git 文件夹 git status 查看 文件/文件夹 状态 git add 需要追踪的文件名/文件夹名 提交到暂存区 git add…

SpringBoot集成Minio

pom文件导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

kubeadm部署

准备环境 master、node1、node2 关闭SWAP\SELINUX\FIREWALLD\开启网卡转发 配置YUM源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo > [kubernetes] > nameKubernetes > baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_6…

基于深度学习的多类别电表读数识别方案详解

基于深度学习的多类别电表读数识别方案详解 多类别电表读数识别方案详解项目背景项目难点最终项目方案系列项目全集&#xff1a; 安装说明环境要求 数据集简介数据标注模型选型明确目标&#xff0c;开始下一步的操作 检测模型训练模型评估与推理番外篇&#xff1a;基于目标检测…

C++力扣题目701--二叉搜索树中的插入操作

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效的插入方式&a…

蓝桥杯省赛无忧 STL 课件17 map

01 map 02 multimap 03 unordered_map 04 代码示例

微信商家转账到零钱怎么开通?场景模板

商家转账到零钱是什么&#xff1f; 使用商家转账到零钱这个功能&#xff0c;可以让商户同时向多个用户的零钱转账。商户可以使用这个功能用于费用报销、员工福利发放、合作伙伴货款或分销返佣等场景&#xff0c;提高效率。 商家转账到零钱的使用场景有哪些&#xff1f; 商家…

ES API 批量操作 Bulk API

bulk 是 elasticsearch 提供的一种批量增删改的操作API。 bulk 对 JSON串 有着严格的要求。每个JSON串 不能换行 &#xff0c;只能放在同一行&#xff0c;同时&#xff0c; 相邻的JSON串之间必须要有换行 &#xff08;Linux下是\n&#xff1b;Window下是\r\n&#xff09;。bul…

【AUTOSAR】--01 AUTOSAR网络管理基础

AUTOSAR网络管理做了几个项目了&#xff0c;但发现还是有些理解不够深入的地方&#xff0c;最近趁着有个新项目也要做AUTOSAR网络管理&#xff0c;再从头梳理一下AUTOSAR网络管理&#xff0c;预计用2-3篇文章&#xff0c;把AUTOSAR网络重新梳理完成。 这是第一篇&#xff0c;主…

鸿蒙开发-UI-组件-状态管理

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 文章目录 前言 一、什么是状态管理 二、管理组件拥有的状态 1.组件内状态 State装饰器 2.父子组价单向同步 Prop装饰器 3.父子双向同步 Link装…

yolov5模型Detection输出内容与源码详细解读

文章目录 前言一、Detiction类源码说明二、Detection类初始化参数解读三、Detection的训练输出源码解读四、Detection的预测输出源码解读1、self.grid内容解读2、xy/wh内容解读3、推理输出解读 总结 前言 最近&#xff0c;需要修改yolov5推理结果&#xff0c;通过推理特征添加…
最新文章