当前位置: 首页 > news >正文

C语言----操作符详解(万字详解)

目录

1. 操作符的分类

2. 二进制和进制转换

3. 原码 反码 补码

4. 移位操作符

4.1 左移操作符 >>

4.2 右移操作符 >>

5. 位操作符

5.1 按位与 &

5.2 按位或 |

5.3 按位异或 ^

5.4 按位取反 ~

练习 整数存储在内存中二进制中1的个数

练习 二进制位置置0或者置1

6.  单目操作符

7.  逗号表达式

8. 下标访问[  ]   函数调用( )

8.1 [ ] 下标引用操作符

8.2 () 函数调用操作符

9. 结构成员的访问操作符

9.1 结构体

9.2 结构体的声明

9.3 结构体变量的声明与初始化

9.3.1 声明结构体变量

9.3.2 初始化结构体变量

9.4 访问结构体成员

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

10.1  优先级

10.2  结合性

11. 表达式求值

11.1 整型提升

11.2 算数转换


1. 操作符的分类

类型具体操作符
算术操作符+(加法)、-(减法)、*(乘法)、/(除法)、%(取模 / 取余)
移位操作符<<(左移)、>>(右移)
位操作符&(按位与)、(按位或)、^(按位异或)
赋值操作符=(简单赋值)、+=(加法赋值)、-=(减法赋值)、*=(乘法赋值)、/=(除法赋值)、%=(取模赋值)、<<=(左移赋值)、>>=(右移赋值)、&=(按位与赋值)、=(按位或赋值)、^=(按位异或赋值)
单目操作符!(逻辑非)、++(自增)、--(自减)、&(取地址)、*(指针取值 / 解引用)、+(正号)、-(负号)、~(按位取反)、sizeof(获取字节数)、(类型)(类型转换)
关系操作符>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)、!=(不等于)
逻辑操作符&&(逻辑与)、(逻辑或)
条件操作符? :(三元条件)
逗号表达式操作符,(逗号)
下标引用操作符[ ](方括号)
函数调用操作符( )(圆括号)
结构成员访问操作符.(结构体变量成员访问)、->(结构体指针成员访问)

上面的操作符  我们在数据类型和变量中以及学过了一部分 今天我们继续具体介绍我们没有学过的操作符 但那之前 我们得学习一下二进制 因为有些操作符与二进制有关

2. 二进制和进制转换

在以前学数学时 我们也听说过2进制 10进制 那他们是什么意思呢 ?

其实2进制 8进制 10进制 16进制 都是值的不同表现形式 只不过我们平常使用值的时候都默认了10进制方式

15的2进制        1111

15的8进制        17

15的10进制      15

15的16进制       F

在十进制中的 152  其中2是个位  5是十位  1是百位 相当于权重

123相当于3乘以10的0次方+2乘以10的1次方+1乘以10的2次方  往后依次在次方上按顺序+1

而理解了十进制之后 其实其他进制也是相同理解

比如2进制的1101   从左到右分别是2的0  1  2  3次方 

那么就相当于1✖2的0次方+1✖2的1次方+0✖2的2次方+1✖2的3次方 既1+2+4+8=13

因此二进制的1101实际上就是13  也就是10进制的13

再举个8进制的例子 8进制的17是多少呢?

7✖8的0次方+1✖8的1次方=7+8=15    既15的8进制写法就是17

而最后我们就来讲解以下16进制 

首先我们知道2进制数字是由0 1组成  8进制是由0~7组成  10进制由0~9组成  因为分别满2 8 10会进一位

而16进制呢? 因为0~9不够 因此我们使用ABCDEF(小写也适用)来分别表示10 11 12 13 14 15 这样就可以表示完了

比如F  就是F✖16的0次方=15✖1=15

而2进制如何转10进制呢   刚才已经讲过了 权重✖权重值即可

10进制如何转换成2进制呢 如下图

通过10进制数字 除以2 得到的余数 从下往上写就是转换出的2进制

而下面在计算机上试着看看相同数字 不同进制时的值是多少

可以看出来数字都是161  而10进制的值就是161  8进制的值是113  16进制的值是353

而下面我们来说说2进制 转8进制和16进制的方法

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

比如2进制位的01101011 换算成8进制就是0153  这是8进制表示方法 0开头的数字

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

比如2进制的01101011 换成16进制表示就是0x6b  这是16进制表示方法 0x开头的数字

同理 8进制位和16进制位 转2进制只需要反着来1个8进制位转换成3个2进制位  1个16进制位转换成4个2进制位即可

3. 原码 反码 补码

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

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

符号位都是用0表示"正'   用1表示"负' 剩余的都是数值位

而无符号的整数 全部都是数值位

有符号的整数既 signed int  而无符号的整数既 unsigned int 

而他们的原码反码补码怎么算呢?

原码: 直接将数值按照正负数的形式翻译成二进制得到的就是原码

反码: 原码的符号位不变  其他位依次按位取反就可以得到反码

补码:  反码+1就得到补码

: 补码得到原码也是使用:  取反   +1  的操作

举例如下:

无符号整型的三种 2进制表示相同  没有符号位  每一位都是数值位

对于整型来说:数据存放在内存中的其实是补码  那为什么呢?

  1. 加减统一:减法变加法,硬件只需加法器,省成本。
  2. 零唯一:消灭-0,多存一个数(如-128),不浪费。
  3. 运算快:CPU直接算,无需额外处理符号位。
    本质:用“补数”思想(如钟表倒拨=正拨)实现高效计算。

4. 移位操作符

<<  左移操作符     >>  右移操作符   

注:移位操作符的操作数只能是整数 不能是小数和负数

我将通过具体的例子来解释

4.1 左移操作符 >>

从图中 我们就了解到了左移操作符的用法  并且知道了左移操作符并不会改变操作数的值 

而为什么左移操作符移动一位后 值会变大2呗呢  那是因为左移一位之后 二进制数都变大了两倍 因此整体也变大两倍

同理 移动2位 则变大了四倍 如图

注: 并不是所有的数左移一位都变大两倍 

同理 负数也满足此规则

具体操作过程如下图

4.2 右移操作符 >>

首先 右移操作符分为两类 

1 逻辑右移  :  左边用0填充,右边丢弃

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

注: 右移具体是什么右移取决于编译器 而大部分编译器都是采用 算术右移

验证:

逻辑右移用0填充 而算数右移中整数是0开头 也会用0填充 因此我会选择负数 负数的符号位为1 这样就可以判断出来

可以看出来 的确是-5 因此判断出来是补的原本的数值位 因此我的编译器采用的是算数右移

快去试试你的编译器吧

警告: 对于移位操作符来说 不能移动负数位 这个是标准未定义的 

5. 位操作符

位操作符有  ( 双目操作符 )

&            // 按位与            区别于 && 逻辑与 -- 并且

|             // 按位或               区别于 | | 逻辑或 -- 或者

^            // 按位异或                     

~            // 按位取反                       

注: 位指的是二进制位

下面我将用具体的例子来讲解

5.1 按位与 &

这就是 按位与 & 

特点: 按照对应的二进制进行与运算 只要有0则为0   两个同时为1 才为1

5.2 按位或 |

这就是 按位或 |

特点: | 是按位或 是对应的二进制位或运算 只要有1就是1 两个为0才是0

5.3 按位异或 ^

这就是 按位异或 ^

特点:异或 ^ 对应的二进制位 相同为0 相异为1   

5.4 按位取反 ~

这就是 按位取反 ~

特点:按位取反  ( 原来是0变成1 原来是1变成0 )

按位异或 ^ 有什么作用呢?

当我们需要交换两个数的值 但不能创建新变量(第三个变量)时  ^ 就能发挥作用了 

而上述代码是如何完成交换的呢 这就是 ^ 的作用了

首先我们知道 异或: 相同为0,相异为1

a^a=0    0^a=a

3^3=0   3^3^5=5   

而3^5^3的值依旧是5  既 异或是支持交换律的

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main()
{int a = 10;int b = 20;printf("a=%d\n", a);printf("b=%d\n", b);//我们使用a'来作为中间变量理解 代入既可理解 ^a = a ^ b; // a'=a^bb = a ^ b; // b=a'^b=a^b^b=aa = a ^ b; // a=a'^b=a^b^a=bprintf("交换后\n");printf("a=%d\n", a);printf("b=%d\n", b);return 0;
}

而相同为0 是不可能会进位的 这样也避免的值溢出的问题

练习 整数存储在内存中二进制中1的个数

思路: 和十进制整数求相似  12343%10可以得到个位 在/10 可以得到1234 这样依次既可以计算 同理二进制则%2  /2

输入15时 得出4  我们知道15的补码是00000000000000000000000000001111确实有4位1

但当我们输入负数时呢

因此以上代码对负数是不友好的 只能计算二进制正整数中1的个数

因此我们做以下更改

首先我们得知道  

//  100000000000000000000000000001111  -   n

//  000000000000000000000000000000001  - 1

//  000000000000000000000000000000001   -  n按位与1 既n&1

无论前面的数是什么  按位与1时 只用管最后一位是不是1 如果是1 那结果也为1   不是1那就是0 

可以看出 代码运行无误   15的进制补码中有4个1     -1的补码中有32个1

其实还有更优解 如下

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

代码解释:

例如15的二进制是1111    14是1110

1111&1110=1110       既n=n&(n-1) 继续往复

1110&1101=1100

1100&1011=1000

1000&0111=0000

一共执行了4次 最后为0 而正好15的二进制数里有4个1  因此可以使用while循环和n=n&(n-1)来实现目的

练习 二进制位置置0或者置1

例如把改变13的第5位修改为1  然后在修改为0

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main()
{int a = 13;//13=00001101// | 00010000//   00011101//这样 就能将第五位置为1  而00010000怎么来呢  我们可以使用左移运算符//1左移4位 这样就能得到00010000a |= (1 << 5-1);printf("a的值为%d", a);return 0;
}

上述操作就可以将第五位修改为1  使用到了 按位或 和左移运算符 经此启发 

我们将第五位修改为0可以通过下面代码实现

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main()
{int a = 13;//13=00001101// | 00010000  按位与 |//   00011101// & 11101111  按位或 &//   00001101//这样通过 & 就可以实现第五位转换为0 //而11101111怎么获得呢? 可以发现它就是00010000的反码//既 ~(1<<5-1)a |= (1 << 5-1);printf("a的值为%d\n", a);a &= ~(1 << 5 - 1);printf("a的值为%d\n", a);return 0;
}

可以看出运行结果的确正确 如下:

其中 我们运用到了 按位或 按位取反 左移运算符等

6.  单目操作符

单目操作符我们已经在数据类型和变量中学过了  如下

其中 只有 * 和 & 没有具体讲解 这一块将在之后的指针章节中具体介绍

7. 逗号表达式

首先逗号表达式是什么呢?

逗号表达式就是用逗号隔开的多个表达式

特点: 从左往右依次执行 整个表达式的结果是最后一个表达式的结果

整体结果是expN

下面具体举例 

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

代码运行结果是什么呢?   如下

结果是25  因为从左往右计算 a=b+10=24  b=a+1=24+1=25

逗号表达式最后一个式子的值为结果 因此d的值是25

而逗号表达式的优势在于哪里呢?  那就是可以精简代码  如下代码

a = get_val();
count_val(a);
while (a >0)
{//处理过程// ~~~~a = get_val();count_val(a);
}

当有如上代码时 我们可以用逗号表达式来精简 如下

while (a = get_val(), count_val(a) ,a >0)
{//处理过程// ~~~
}

8. 下标访问[  ]   函数调用( )

8.1 [ ] 下标引用操作符

操作数:一个数组名+一个索引值(下标)

int arr[10];
arr[8]=8;
[ ]的两个操作数是arr和8

8.2 () 函数调用操作符

int main()
{
printf("hello");// ()是函数调用操作符
int a=add(3,5); // ()是函数调用操作符
// () 的操作数是函数名和参数  至少有一个函数名 可以不要参数
return 0;
}

9. 结构成员的访问操作符

9.1 结构体

C语言已经提供了内置类型  如 char short int long double等等  但是只有这些内置类型还是不够的  比如我想描述学生 描述一本书  这时单一的内置类型是不行的

描述一个学生需要满足 年龄 学号 身高 体重等

描述一本书需要 满足   作者 出版社 书名 定价等  C语言为了解决这个问题 增加了结构体这种自定义的类型数据  让程序员可以自己创造适合的类型

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

9.2 结构体的声明

使用 struct 关键字定义结构体,语法如下:

struct 结构体名 {数据类型 成员1;数据类型 成员2;// ...更多成员
};

示例:定义一个表示学生的结构体

struct Student {int id;         // 学号char name[20];  // 姓名float score;    // 成绩
};

9.3 结构体变量的声明与初始化

9.3.1 声明结构体变量

// 方式1:先定义结构体,再声明变量
struct Student stu1, stu2;// 方式2:定义结构体时直接声明变量
struct Student   {int id;char name[20];float score;} stu3, stu4;  // stu3和stu4是全局变量

9.3.2 初始化结构体变量

// 按成员顺序初始化
struct Student stu1 = {101, "Alice", 90.5};// 指定成员初始化(C99标准支持)
struct Student stu2 = {.name = "Bob", .score = 85.0f};

通过调试来具体观察初始化

9.4 访问结构体成员

使用 . 运算符 访问成员:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
struct Student {int id;         // 学号char name[20];  // 姓名float score;    // 成绩		score	90.5000000	float};
struct Student stu1, stu2;
int main()
{struct Student stu1 = { 101, "Alice", 90.5 };struct Student stu2 = { .name = "Bob", .score = 85.0f };stu1.id = 1001;strcpy(stu1.name, "Tom");  // 字符串需用strcpy赋值stu1.score = 92.5;printf("ID: %d, Name: %s, Score: %.1f\n",  stu1.id, stu1.name, stu1.score);return 0;
}

运行结果如下:

结构体指针与 -> 运算符

如何通过指针操作结构体,需用 -> 访问成员   稍后在指针章节在讲

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

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

10.1 优先级

优先级指的是 如果一个表达式包含多个运算符 哪个运算符应该优先执行 各种运算符的优先级是不一样的

3+4*5; //*优先级更高 因此先算4*5 后算+

10.2 结合性

如果两个算数符优先级相同 优先级没有办法确定先算哪一个时 这时候就看结合性了 根据运算符是左结合 还是右结合 决定执行顺序 大部分运算符是左结合(既从左往右计算)  少数运算符是从右往左计算 比如说赋值运算符( = )

比如 6/3*2  假如先算3*2那结果就是1  若先算6/3那结果就是4

因此结合性的作用在无法确定优先性时就会体现出来  上面的例子就是左结合起了作用

11. 表达式求值

11.1 整型提升

基本概念:

整型提升是指当表达式中使用比int小的整型类型(如charshort等)时,这些值会被自动提升为int类型(如果int能够表示原类型的所有值)或unsigned int类型(如果不能)。

整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度.
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

总结:

意义说明
提高运算效率CPU 更擅长处理 int 大小的数据,减少额外指令开销
防止数据溢出提升到 int 后,中间结果不易溢出
统一运算规则避免混合类型运算的歧义,保证可移植性
符合语言标准C/C++ 标准要求整型提升,确保行为一致
简化编译器实现减少特殊情况处理,优化代码生成

整型提升虽然是一个隐式的过程,但它在底层优化、防止错误、保证可移植性等方面起着重要作用。理解整型提升有助于编写更健壮、高效的代码,并避免一些微妙的类型相关错误。

如何进行整型提升呢?

1.有符号整数提升是按照变量的数据类型的符号位来提升的

2.无符号整数提升 高位补0

以下代码运算结果是多少呢?

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main() {char a = 20;char b = 120;char c = a + b;printf("%d\n", c);return 0;
}

结果如下:

为什么 得出c的值是-116 而不是140呢 原因如下 让我们利用整型提升的知识来讲解

注:char类型占8位  short类型占16位 int类型占32位

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main() {char a = 20;//截断后存储到a中//00010100 - a //00000000000000000000000000010100    a整型提升char b = 120;//01111000 - b //00000000000000000000000001111000    b整型提升char c = a + b;// 00010100- a// 00000000000000000000000000010100// 01111000- b// 00000000000000000000000001111000// // 00000000000000000000000000010100// 00000000000000000000000001111000// 00000000000000000000000010001100 - 整型提升后相加// 10001100 - C 通过整型提升得到补码printf("%d\n", c);//%d-以10进制的形式,打印一个有符号的整型(int)//11111111111111111111111110001100 - 补码//10000000000000000000000001110011//10000000000000000000000001110100 - 原码//不难看出值是-116 return 0;
}

11.2 算数转换

如果某个操作符的各个操作数属于不同的类型 那么除非其中一个操作数转换位另一个操作数的类型 否则操作就无法进行 下面的层次体系称为寻常算数转换

如下:

100和55.5f是无法进行直接加法运算的 因此需要将100转换为flort类型 

结语:

以上就是关于操作符的详细介绍 创作不易 若对您有帮助 请点点关注点点赞  鄙人不胜感激.❀

相关文章:

C语言----操作符详解(万字详解)

目录 1. 操作符的分类 2. 二进制和进制转换 3. 原码 反码 补码 4. 移位操作符 4.1 左移操作符 >> 4.2 右移操作符 >> 5. 位操作符 5.1 按位与 & 5.2 按位或 | 5.3 按位异或 ^ 5.4 按位取反 ~ 练习 整数存储在内存中二进制中1的个数 练习 二进制位…...

docker本地部署ClipCascade,实现跨设备剪贴板同步

1、什么是 ClipCascade &#xff1f; ClipCascade 是一款开源的轻量级工具&#xff0c;可以自动同步您的剪贴板在多个设备之间&#xff0c;无需按键。它确保设备之间无缝的剪贴板共享&#xff0c;并以端对端加密优先保护隐私。无论您是在不同工作站之间切换&#xff0c;还是仅…...

Android Compose vs 传统View系统:全面对比与选型指南

Android Compose vs 传统View系统&#xff1a;全面对比与选型指南 一、引言 随着Android Jetpack Compose的正式发布&#xff0c;Android开发迎来了全新的声明式UI框架。本文将全面对比Compose与传统View系统的差异&#xff0c;帮助开发者做出合理的技术选型。 二、核心架构…...

CVE-2024-3431 EyouCMS 反序列化漏洞研究分析

易优内容管理系统(EyouCms) 隶属于海口快推科技有限公司&#xff0c;专注中小型企业信息传播解决方案&#xff0c;利用网络传递信息在一定程度上提高了办事的效率&#xff0c;提高企业的竞争力。EyouCms 是一个自由和开放源码的内容管理系统&#xff0c;它是一个可以独立使用的…...

C# wpf

学习网址&#xff1a;控件的父类们 - WPF中文网 - 从小白到大佬 控件的父类&#xff1a; 由此我们可以得出结论&#xff0c;控件的父类们(准确的说&#xff0c;应该叫父类的父类的父类)&#xff0c;至少有如下几个类型&#xff1a; DispatcherObjectDependencyObjectVisualU…...

十一、引用与拷贝函数(References the Copy-Constructor)

十一、引用与拷贝函数&#xff08;References & the Copy-Constructor&#xff09; 11.1 指针回顾&#xff08;Review of pointers&#xff09; 指针可以保存一个地址。 当你定义一个指针时&#xff0c;必须指定它所指向变量的类型&#xff0c;并且应该初始化它。 示例&a…...

数据结构之顺序表

目录 1.线性表 1.1 线性表的定义&#xff1a;零个或多个数据元素的有限序列。 1.2深度解析 1.3 线性表的抽象数据类型 2.顺序表 2.1 顺序表的定义和存储方式 2.2静态顺序表 2.2.1 静态顺序表的使用 2.2.3 为什么我们要使用typedef呢&#xff1f; 2.2.4 为什么我们要使…...

【计算机视觉】三种图像质量评价指标详解:PSNR、SSIM与SAM

图像质量评价指标详解&#xff1a;PSNR、SSIM与SAM 文章目录 图像质量评价指标详解&#xff1a;PSNR、SSIM与SAM1. 峰值信噪比(PSNR)1.1 数学定义1.2 特点与局限性 2. 结构相似性指数(SSIM)2.1 数学定义2.2 特点与应用 3. 光谱角度映射器(SAM)3.1 数学定义3.2 特点与应用 4. Py…...

轻舟系列FPGA加速卡:大模型分布式训练中的高效协同者

在超大规模模型&#xff08;如千亿级参数&#xff09;的分布式训练中&#xff0c;计算、存储与通信的协同优化是突破性能瓶颈的关键。绿算技术公司的轻舟系列FPGA加速卡凭借其低延迟、高能效和可编程特性&#xff0c;能够成为分布式训练架构中的异构加速节点。其在训练集群中的…...

C++20 小语法

这个提案允许在static_assert和if constexpr中从整形转换为布尔类型。 以下表格就可以表示所有内容。 对于严格的C 编译器来说&#xff0c;以前在这种情境下int无法向下转换为bool&#xff0c;需要手动强制转换&#xff0c; C23 这一情况得到了改善。 对于严格的C编译器来说&a…...

LM393比较器的比较翻转电压不对

问个问题&#xff0c;用的LM393比较器&#xff0c;3.3V供电&#xff0c;比较器输出上拉到3.3V&#xff0c; V给的基准2.8V&#xff0c;V-电压从1V升到2.3V&#xff0c;比较器就输出0V了&#xff0c;按理论超过2.8V才翻转到0V的 根据问题描述和电路分析&#xff0c;比较器LM393…...

解决 shadui组件库Popover 点击后会消失

react用了shadui组件库 <Popover><PopoverTrigger><div className"text-operation-item" onClick{props.callback}><img src{props.imgSrc} width{20} height{20} /></div></PopoverTrigger><PopoverContent className"…...

国联股份卫多多与北京慧闻科技(集团)签署战略合作协议

4月27日&#xff0c;北京慧闻科技&#xff08;集团&#xff09;有限公司&#xff08;以下简称“慧闻科技”&#xff09;销售总监王兴卓一行到访国联股份卫多多&#xff0c;同卫多多/纸多多副总裁、产发部总经理段任飞&#xff0c;卫多多机器人产业链总经理桂林展开深入交流&…...

从数据到决策:如何使用Python进行自动驾驶数据分析

从数据到决策:如何使用Python进行自动驾驶数据分析 大家好,我是Echo_Wish,今天来和大家聊一聊在自动驾驶领域中,如何通过Python进行数据分析。随着自动驾驶技术的不断发展,数据分析在这一领域的作用越来越重要。从传感器数据的处理到模型的训练和优化,Python在自动驾驶数…...

IIS服务器提示ERR_HTTP2 PROTOCOL ERROR解决方案

今天我的淘宝店来了一个客户&#xff0c;说小程序苹果访问没问题&#xff0c;安卓系统访问出现ERR HTTP2 PROTOCAL ERROR的错误见下图 方法供大家闭坑步骤&#xff1a;通过注册表修改(高级) 打开注册表编辑器 (regedit) 导航到&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\Current…...

Django的异步任务队列管理_Celery

1 基本原理 Celery 是一个异步任务队列&#xff0c;能够将耗时操作&#xff08;如发邮件、处理图片、网络爬虫等&#xff09;从 Django 主线程中分离出来&#xff0c;由后台的 worker 处理&#xff0c;避免阻塞请求。Celery 作为独立运行的后台进程&#xff08;Worker&#xf…...

Ubuntu18.04安装IntelliJ IDEA2025步骤

1.下载linux版本的idea 复制下面链接到虚拟机浏览器 下载 IntelliJ IDEA 下载好后&#xff0c;你的文件里会多一个文件&#xff0c;如下图 2.解压并运行Idea 2.1在/usr/local/路径下新建安装目录IDEA&#xff1a; 打开终端输入以下命令&#xff1a; sudo mkdir -p /usr/loc…...

LLM - Large Language Model

回顾2024&#xff1a;与LLM又相伴一年的经历与思考 - 知乎万字长文入门大语言模型&#xff08;LLM&#xff09; - 知乎“大模型本质就是两个文件&#xff01;”特斯拉前AI总监爆火LLM科普&#xff0c;时长1小时&#xff0c;面向普通大众 - 知乎大模型本质及趋势剖析&#xff0c…...

解决Ubuntu20.04重启出现显卡驱动异常的问题(操作记录)

一、问题情况 电脑异常断电&#xff0c;重启后&#xff0c;显示界面异常&#xff0c;显卡驱动已丢失。 二、操作流程 1、查看安装显卡驱动 ls /usr/src | grep nvidia 记住该驱动&#xff0c;我的是nvidia-550.127.05 2、安装dkms&#xff08;如果没有&#xff09; sudo …...

23.开关电源干扰控制的EMC改善措施

开关电源干扰控制的EMC改善措施 1. 开关电源的EMI干扰机理2. 钳位抑制EMI3. 阻容吸收抑制EMI4. 波形整形抑制EMI 1. 开关电源的EMI干扰机理 2. 钳位抑制EMI 只能抑制Ts阶段。 3. 阻容吸收抑制EMI 4. 波形整形抑制EMI...

新能源汽车声纹监测技术的发展趋势是什么?

新能源汽车声纹监测技术有以下发展趋势&#xff1a; 智能化与自动化程度不断提高 故障自动诊断与预警&#xff1a;未来声纹监测系统将能够更加准确地自动识别和分析新能源汽车各部件的声纹特征变化&#xff0c;不仅能检测出故障&#xff0c;还能对故障的发展趋势进行预测&…...

如何获取按关键字搜索京东商品详情(代码示例)

在电商领域&#xff0c;获取京东商品的详细信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。京东作为国内知名的电商平台&#xff0c;提供了丰富的商品资源。通过 Python 爬虫技术&#xff0c;我们可以高效地获取京东商品的详细信息&#xff0c;包括商品名…...

C#中构造器及属性的加载顺序

一.基本原则: 先加载静态构造函数和静态字段,后加载普通构造函数和普通字段;先加载基类再加载子类; 二.具体的加载顺序: 父类静态字段--->父类静态构造函数--->子类静态字段--->子类静态构造函数--->父类实例字段---> 父类实例构造函数--->子类实例字段-…...

vue项目中如何使用markdown编辑器

在开发中,编辑markdown和回显markdown都是常见的需求。在vue(2.x和3.x都可以)中可以使用mavon-editor这个第三方依赖包。示例很简单易懂。 安装 npm install mavon-editor 注册 在main.js中注册这个组件 import Vue from vue import mavonEditor from mavon-editor impor…...

Python爬虫(9)Python数据存储实战:基于pymysql的MySQL数据库操作详解

目录 一、背景与核心价值二、pymysql核心操作详解2.1 环境准备2.2 数据库连接与基础操作2.3 事务处理与错误回滚2.4 高级功能&#xff1a;批量插入与性能优化 三、pymysql进阶技巧3.1 连接池管理&#xff08;推荐使用DBUtils&#xff09;3.2 SQL注入防御3.3 与ORM框架对比 四、…...

WPF之Button控件详解

文章目录 1. 引言2. Button控件基础Button类定义 3. Button控件的核心属性3.1 Content属性3.2 IsDefault属性3.3 IsCancel属性3.4 其他常用属性 4. 按钮样式与模板自定义4.1 简单样式设置4.2 使用Style对象4.3 触发器使用4.4 使用ControlTemplate完全自定义4.5 按钮视觉状态 5.…...

如何查看电脑电池使用情况

第一步打开cmd&#xff1a; 在键盘上按下winr 或者在搜索框中输入cmd 点击命令提示符 进入命令框 第二步输入命令&#xff1a; powercfg/batteryreport 出现如下情况 第三部找到对应电池报告进行查看&#xff1a; 在对应路径下找到电池报告 点击battery-report.html 到此…...

软考-软件设计师中级备考 6、数据结构 图

1. 有向图 有向图是由顶点集合 V 和有向边集合 E 组成的图结构。在有向图中&#xff0c;边是有方向的&#xff0c;即从一个顶点指向另一个顶点&#xff0c;通常用有序对 (u, v) 表示&#xff0c;其中 u 是边的起始顶点&#xff0c;v 是边的终止顶点。例如&#xff0c;在一个表…...

Label Studio 软件介绍及安装使用说明

背景说明 在做AI项目建模的时候&#xff0c;往往需要数据标注工作&#xff0c;比较常用的数据标注软件是Labeling或者Labelme,这两个都是离线的单独标注软件&#xff0c;使用起来是比较方便的&#xff0c;也是入门级学者比较适合的软件&#xff0c;然而有时候我们数据标注的数据…...

Azure 数字孪生是什么?

“Azure 数字孪生”是一项平台即服务 (PaaS) 产品/服务&#xff0c;它能够创建基于整个环境的数字模型的孪生图&#xff0c;这些图可能是建筑物、工厂、农场、能源网络、铁路、体育场馆&#xff0c;甚至整个城市。 这些数字模型可用于获取洞察力&#xff0c;以推动产品改进、运…...

界面控件DevExpress WPF v25.1预览 - AI功能增强(语义搜索)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

【神经网络与深度学习】五折交叉验证(5-Fold Cross-Validation)

引言 五折交叉验证&#xff08;5-Fold Cross-Validation&#xff09;是一种广泛应用于机器学习模型性能评估的技术&#xff0c;通过多次实验确保模型的评估结果更加稳定、可靠&#xff0c;同时最大限度地利用有限的数据资源。它将数据分成若干子集&#xff0c;交替作为训练集和…...

Linux权限概念讲解

1. 用户类型 1.1 用户分类 在Linux里面用户分为两类&#xff0c;一种是超级用户&#xff08;root&#xff09;&#xff0c;一种是普通用户。 超级用户只有一个&#xff0c;而普通用户可以有很多个。 如果我们在root用户状态下想要变成普通用户&#xff0c;我们可以使用命令…...

网络安全零基础培训 L1-8 PHP基础语法

文章目录 1 认识PHP1.1 PHP简介1.2 主要的特点1.3 跨平台性1.4 与数据库的良好集成1.5 开源和社区支持1.6 应用场景1.6.1 网站开发1.6.2 内容的管理程序1.6.3 Web应用程序开发1.6.4 为什么学习了解PHP 2 PHP的基础语法2.1 创建第一个PHP程序2.2 如何写注释2.3 PHP的变量2.4 PHP…...

鸿蒙 长列表加载性能优化

长列表加载性能优化 针对长列表加载这一场景&#xff0c;对列表渲染时间、页面滑动帧率、应用内存占用等方面带来优化&#xff0c;提升性能和用户体验的手段有如下 4 种&#xff1a; 懒加载&#xff1a;提供列表数据按需加载能力&#xff0c;解决一次性加载长列表数据耗时长、…...

第十二届蓝桥杯 2021 C/C++组 卡片

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 卡片 - 蓝桥云课 思路&#xff1a; 思路详解&#…...

vscode 使用gitcode团队管理项目

1、下载安装vscode https://code.visualstudio.com/Download 2、安装git 3、在vscode中安装GitLens插件 4、打开终端 点击会显示当前更改的项目 5、提交更改的文件&#xff0c;会提示输入用户名、密码&#xff0c;这里的密码即是令牌&#xff0c;令牌在第一次创建的时候显…...

uniapp+vue3+ts 使用canvas实现安卓端、ios端及微信小程序端二维码生成及下载

加粗样式uniapp多端生成带二维码海报并保存至相册的实现 在微信小程序开发中&#xff0c;我们常常会遇到生成带有二维码的海报并保存到手机相册的需求&#xff0c;比如分享活动海报、产品宣传海报等。今天就来和大家分享一下如何通过代码实现这一功能。 准备工作 在开始之前&am…...

vue mixin混入与hook

mixin混入是 ‌选项式 API‌&#xff0c;在vue3-Composition API <script setup> 中无法直接使用&#xff0c;需通过 setup() 函数转换 vue2、vue3选项式API: // mixins/mixin.js export const mixin {methods: {courseType(courseLevel) {const levelMap {1: 初级,…...

《Masked Autoencoders Are Scalable Vision Learners》---CV版的BERT

目录 一、与之前阅读文章的关系&#xff1f; 二、标题&#xff1a;带掩码的自auto编码器是一个可拓展的视觉学习器 三、摘要 四、核心图 五、结果图 六、不同mask比例对比图 七、“Introduction” (He 等, 2021, p. 1) 引言 八、“Related Work” (He 等, 2021, p. 3)相…...

(云计算HCIP)HCIP全笔记(十三)本篇介绍虚拟化技术,内容包含:虚拟化资源、虚拟化过程、I/O虚拟化、虚拟化架构KVM和Xen介绍、主流虚拟化技术介绍

1. 虚拟化资源 1.1 虚拟化对象 CPU虚拟化&#xff1a; 目标是使虚拟机上的指令能被正常执行&#xff0c;且效率接近物理机 内存虚拟化&#xff1a; 目标是能做好虚拟机内存空间之 间的隔离&#xff0c;使每个虚拟机都认为自己拥有了整个内存地址&#xff0c;且效率页能接近物理…...

C++核心编程:类与对象全面解析

C核心编程&#xff1a;类与对象全面解析 大家好&#xff01;今天我要和大家深入探讨C面向对象编程中最核心的概念&#xff1a;类与对象。&#x1f468;‍&#x1f4bb; 这是我们迈向高级C开发的第一步&#xff0c;掌握好这部分内容&#xff0c;对未来学习更高级的设计模式和框…...

Linux基础命令和文件系统结构:从入门到实践

目录 1. 引言 2. Linux文件系统结构概述 2.1 根目录 ​编辑 2.2 常见目录介绍&#xff1a; 1. /home&#xff1a;用户的家目录 2. /etc&#xff1a;存放配置文件的目录 3. /var&#xff1a;可变数据 4. /bin 和 /sbin&#xff1a;常见命令和系统管理工具 5. /tmp&…...

「Mac畅玩AIGC与多模态05」部署篇03 - 在 Mac 上部署本地向量化模型(Embedding Models)

一、概述 本篇介绍如何在 macOS 环境下,为 Dify 平台部署本地向量化模型(Embedding Models),支持知识库文档向量化、语义检索与智能体上下文增强。向量化模型是实现知识库问答与 RAG(检索增强生成)应用的基础组件。 二、部署流程 1. 环境准备 确认 Docker Desktop 正常…...

Java-Optional类

介绍 Optional是 Java 8 引入的一个类&#xff0c;用于解决空指针异常问题。它本质上是一个容器类&#xff0c;可以包含或不包含一个非空值。 示例 创建Optional对象 Optional.of(T value)&#xff1a;创建一个包含非空值的Optional对象。如传入null值&#xff0c;会抛出Nu…...

Android 热点开发调试总结

Android 热点开发调试总结 文章目录 Android 热点开发调试总结一、前言二、热点开发1、开关和默认配置wifi和热点配置信息保存的位置&#xff1a; 2、主要流程3、相关日志4、相关广播5、demo示例 三、其他1、Android 热点开发调试小结2、其他热点相关知识小结&#xff08;1&…...

【“星瑞” O6 评测】 — llm CPU部署对比高通骁龙CPU

前言 随着大模型应用场景的不断拓展&#xff0c;arm cpu 凭借其独特优势在大模型推理领域的重要性日益凸显。它在性能、功耗、架构适配等多方面发挥关键作用&#xff0c;推动大模型在不同场景落地 1. CPU对比 星睿 O6 CPU 采用 Armv9 架构&#xff0c;集成了 Armv9 CPU 核心…...

快乐数(双指针解法)

题目链接202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 题目拆解 1 取一个正整数每一位的平方和为&#xff0c;如果为1那么直接可以判定为快乐数&#xff0c;如果不为1&#xff0c;就重复这个过程&#xff0c;直到出现1 2 实际上&#xff0c;这道题只有两种情况&#xf…...

【Vue3-Bug】中路由加载页面直接显示空白

Vue3中路由加载页面直接显示空白 没有子路由 路由定义不能重复&#xff0c;请自己查看数据在main.js(或者)mina.ts入口文件中&#xff0c;需要将router的注入到vue中的执行放在&#xff0c;vue挂在元素之前 // 顺序不能变 app.use(router) app.mount(#app)在App.vue中 // 在…...

线性代数——行列式⭐

目录 一、行列式的定义⭐ 1-1、三阶行列式练习 1-2、下面介绍下三角行列式、上三角行列式、对角行列式 ​编辑 二、行列式的性质 2-1、性质1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6 ​编辑 2-2、性质7 2- 3、拉普拉斯定理、克莱姆法则 三…...