首页 > 其他分享 >操作符史上最全解析没有之一!!!!!!! (上)

操作符史上最全解析没有之一!!!!!!! (上)

时间:2024-11-02 10:16:03浏览次数:3  
标签:int 最全 二进制位 按位 printf 操作符 sizeof 解析

文章目录

1.算术操作符

//打印小数
printf("%f",5/3.0);
//分子分母至少一位用小数表示

打印2位小数位:

%.2f

scanf()函数输入浮点数:

//float类型
%f
//double类型
%lf

2.移位操作符

左移操作符:左边丢弃,右边补0
右移操作符:
1>算术右移:右边丢弃,左边补原来符号位
2>逻辑右移:右边丢弃,左边补0

注意:在不溢出的前提下(如8位的范围是-128-127),算术右移和逻辑右移的结果一样

#include <stdio.h>
int main()
{
	int a = 2;
	int b = a << 1;
	printf("%d", b);
	return 0;
}

将a二进制位向左移动一位,000000000000000000000000000000010
即4

#include <stdio.h>
int main()
{
	int a = -1;
	int b = a >> 1;
	printf("%d", b);
	return 0;
}
 -1的补码全为1,这里进行的是算术右移

3.位操作符

& 按位与==(对应二进制位只要有0,就为0)
| 按位或(对应的二进制有1则为1,无1则为0
^ 按位异或(对应的二进制位相异为1,相同为0

& 按位与

对应2进制位只要有一个为0即为0

#include <stdio.h>
int main()
{   
	int a = 3;
	int b = 5;
	int c = a & b;
	printf("%d", c);

	return 0;
}

a的二进制位:00000000000000000000000000000011
b的二进制位:00000000000000000000000000000101
则a按位与b : 00000000000000000000000000000001

| 按位或

对应的二进制有1则为1,无1则为0

#include <stdio.h>
int main()
{   
   int a = 3;
   int b = 5;
   int c = a | b;
   printf("%d", c);

   return 0;
}

则c=7

^ 按位异或

对应的二进制位,相异为1,相同为0
如上,c为6

 进行按位操作的两个数必须是整数

例题

在这里插入图片描述
不能引入变量,用异或

#include <stdio.h>
int main()
{   
	int a = 3;
	int b = 5;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("%d %d", a, b);

	return 0;
}

根据相同为0,那么b^b=0
又根据相异为1,所以a^0=a
所以b=a^ b ^b 即把a的值传给b
同理a=b^ a ^a 将b的值传给a

例题:

查找一个数的二进制位中1的数量

#include <stdio.h>
int main()
{   
	int m;
	int c=0;
	scanf("%d", &m);
	int count = 0;
	for (int i = 0;i < 32;i++)
	{
		c = m & 1;
		m = m >> 1;
		if (c == 1)
		{
			count++;
		}
	}
	printf("%d", count);
	return 0;
}

法2

思路:采用相邻的两个数据进行按位与运算
举例:
9999:‭10 0111 0000 1111‬
第一次循环:n=9999   n=n&(n-1)=9999&9998= 9998
第二次循环:n=9998   n=n&(n-1)=9998&9997= 9996
第三次循环:n=9996   n=n&(n-1)=9996&9995= 9992
第四次循环:n=9992   n=n&(n-1)=9992&9991= 9984
第五次循环:n=9984   n=n&(n-1)=9984&9983= 9728
第六次循环:n=9728   n=n&(n-1)=9728&9727= 9216
第七次循环:n=9216   n=n&(n-1)=9216&9215= 8192
第八次循环:n=8192   n=n&(n-1)=8192&8191= 0


可以观察下:此种方式,数据的二进制比特位中有几个1,循环就循环几次,而且中间采用了位运算,处理起来比较高效
*/
int NumberOf1(int n)
{
	int count = 0;
	while(n)
	{
		n = n&(n-1);
		count++;
	}
	return count;
}

4.赋值操作符

-=
+=
*=
/=
%=
<<=
<<=
&=
|=

5.单目操作符

!
+

&
sizeof
~
++
*
类型 (强制类型转换)

~将一个数的二进制位取反(-1补码全为1
*间接访问操作符(解引用操作符)
sizeof意义:操作数的类型长度,字节为单位

#include <stdio.h>
int main()
{   
	int a = 0;
	char arr[10] = {0};
	int brr[10] =  {0};
	printf("%d\n", sizeof(a)); //计算a所占内存大小,单位字节
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof a);  // sizoef不是而是操作符
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(int [10]));//int [10]是数组brr类型
	return 0;
}

结果分别为:4 4 4 10 40

在这里插入图片描述

在这里插入图片描述
short将整形截断为短整形,故答案是2,sizeof括号中的表达式是不参与运算的,其中的运算在编译就完成了,而赋值在运行阶段运行,运行时关于编译的代码已经没有了

在这里插入图片描述
传过去是首元素地址,用指针接收,所以不管char int 类型,都是指针,都是4/8字节

在这里插入图片描述
强制类型转换,将3.14转为整形,但打印结果还是3

6.关系操作符

<
<=
!=
>
>=

==

编程中=和==用错的错误,
比较两个字符串相等用strcmp( , )=0,并引头文件<string.h>

7.逻辑操作符

&& 逻辑与
|| 逻辑或
在这里插入图片描述
&& i=a++,a=0,那么后续不用在计算了,1234
|| 同理,为真则不必计算了,1334

8.条件操作符

三目表达式
exp1 ? exp2 : exp3
条件1成立,则返回2,否则返回3

#include <stdio.h>
int main()
{   
  int max;
  int a = 3;
  int b = 0;
  b = (a > 5 ? 1 : -1);
  max = (a > b ? a : b);
  printf("%d\n", b);\\-1
  pirntf("%d", max);\\3
  return 0;
}

9.逗号表达式

exp1 , exp2 , exp3 , …expn
在这里插入图片描述

标签:int,最全,二进制位,按位,printf,操作符,sizeof,解析
From: https://blog.csdn.net/2403_87165176/article/details/143196469

相关文章

  • 深入学习指针!指针史上最全解析!!(1)
    文章目录1.内存和地址1.1内存1.2究竟该如何理解编址2.指针变量和地址2.1取地址操作符(&)2.2指针变量和解引用操作符(*)2.2.1指针变量2.2.2如何拆解指针类型2.2.3解引用操作符2.3指针变量的大小3.指针变量类型的意义3.1指针的解引用3.2指针+-整数3.3void*指针4.指针运......
  • 图吧垃圾佬理解的早期国产芯片历史(龙芯中科和同行的恩怨解析)
    额……老铁们,我图吧老捡国产芯片垃圾的了。最近有人问咱关于国产芯片发展故事的事,所以咱简单答疑了一下顺带做了个记录的整理,简单看下情况。水友:就是我有个同学,已经魔怔了,现在已经在同学群里说天玑吊打国产芯片了前几天说的是吊打9950x…垃圾佬:吊打国产芯片可能是真的,9950x雀......
  • FPGA数字信号处理—1S上报一次解析数据
    数字信号结果处理完毕之后,需要定时上报,利用计数器完成定时上报;moduleError_bit_report(inputwireclk,//时钟信号inputwirerst_n,//复位信号,低有效inputwireerror_compare_ena,//误码比较使......
  • C++写一个简单的JSON解析
    参考用C++编写一个简易的JSON解析器(1)写一个动态类型-知乎欢迎测试和反馈bug首先,json包含string,number,integer,object,array,bool,null这些类型对于object映射,使用map,对于array使用vector我们定义一个类Val用来存储,使用variant来存储具体的值std::variant-cppreferen......
  • 深入解析 Transformers 框架(三):Qwen2.5 大模型的 AutoTokenizer 技术细节
    前面2篇文章,我们通过查看Transformers包代码,学习了Transformer包模块API设计、模型初始化和加载流程:第1篇:transformers推理Qwen2.5等大模型技术细节详解(一)transformers包和对象加载第2篇:transformers推理Qwen2.5等大模型技术细节详解(二)AutoModel初始化......
  • 深入解析 FastAPI 查询参数:配置、类型转换与灵活组合
    深入解析FastAPI查询参数:配置、类型转换与灵活组合本文全面解析了FastAPI查询参数的使用方法,包括配置默认值、设为可选或必选参数、类型转换以及组合使用等实用技巧。通过查询参数,开发者可以在路径操作函数中接收动态输入,灵活地构建API接口。文章详细说明了如何利用......
  • ETLCloud怎么样?深度解析其在数据管理中的表现
    在BI或数据大屏等数据分析工具中,经常需要从多个业务系统中提取原始数据,然后对数据进行清洗、处理,以获取高质量、有效且干净的数据以供后续的BI进行数据统计和分析使用,从高质量的实现企业数据的价值变现。 然而,在实际操作中,我们常常面临着大量的数据质量问题,如数据缺失、重复、......
  • 遭遇gregn45.dll缺失?完整的应对gregn45.dll缺失修复指南全解析
    在使用电脑的过程中,有时会遇到应用程序或游戏提示“找不到gregn45.dll”或“gregn45.dll缺失”等错误消息。这通常意味着系统无法找到或加载这个关键的动态链接库(DLL)文件,导致相关应用程序或游戏无法正常运行。为了解决这个问题,以下是一份完整的应对gregn45.dll缺失的修复指南。......
  • js手写:防抖&节流 逐行代码解析
    差异分析刚开始写节流的时候,没有真正理解其难点,而且网上的防抖和节流函数,不得不说,真的是鱼龙混杂,有些看了简直添乱。    之前一直认为节流就是“时间间隔T内,点击一个按钮n次,只执行第1和n次”,完全没有体会到节流的难点其实在于多次相同的调用时传递的不同的!参数!防抖......