首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >#C语言——学习攻略:操作符的探索(一)

#C语言——学习攻略:操作符的探索(一)

作者头像
雾忱星
发布于 2025-12-23 14:50:10
发布于 2025-12-23 14:50:10
4410
举报
文章被收录于专栏:C++C++

1. 操作符分类

  • 算术操作符:+、-、*、/、%
  • 移位操作符:<<、>>
  • 位操作符:&、|、^
  • 赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=、
  • 单目操作符:!、++、--、&、*、+、-、~、sizeof(类型)
  • 关系操作符:>、>=、<、<=、==、!=
  • 逻辑操作符:&&、||
  • 条件操作符:exp1?exp2:exp3
  • 逗号表达式:,
  • 下标引用:[ ]
  • 函数调用:()
  • 结构成员访问:. 、->

--上述操作符中,学过了算术、赋值、逻辑、条件以及部分单目操作符,今天继续学习,由于有些操作符会涉及二进制,先来铺垫一下二进制。


2. 二进制和进制转换

--2进制:

  • 逢2进1;
  • 2进制数字都是由0、1组成

2.1 2进制转10进制

--10进制数值: 123 的每一位都是有权重的,数值从右向左依次是个位、十位、百位……,每位权重是10⁰、10¹、10²……如下图——

--类比过去,2进制: 1101 每一位权重就是:2⁰、2¹、2²……

--根据权重,就能很好理解了。

2.1.1 10进制转2进制数字

--当然对于简单的10进制数值,可以直接选择权重相加,选上的为1,反之0,大家可以试一试!

2.2 2进制转8进制、16进制

2.2.1 2进制转8进制

--8进制数字由0~7组成,0~7数值转2进制,最多3个2进制位就够了;最大值7转2进制:111。

--转换规则:从2进制序列最右端向左每三个2进制位换一个8进制位,剩余不够三个的直接换:

--如2进制01101011转8进制-0153(0开头数值被视为8进制)

2.2.2 2进制转16进制

--16进制数字由0~9、a~f(表示10进制10~15)组成,各自写成2进制,最多有4个二进制位就够了,比如f的2进制-1111;

--转换规则:从2进制序列最右端向左每4个2进制位换一个16进制位,剩余不够四个直接换。

--如2进制:01101011,换成16进制:0x6b(表示16进制,前加0x)


3. 原码、反码、补码

--整数的2进制表示:原、反、补(32位)。

--有符号整数三种表示方法均由符号位、数值位,2进制序中,最高位的1位被视作符号位,其余数值位。

--无符号整数则都是数值位。

--符号位:"0"表示"正"、"1"表示"负"。

--正整数的原、反、补相同;负整数三种各不相同。

--原:直接将数值按正负数形式翻译成2进制;

--反:原码符号位不变,其余取反(0—>1\1—>0)即可;

--补:反码+1;(补码换原码:取反,+1);

--对于整型:数据存放在内存中放的是补码,为什么?

--使用补码,可以将符号位、数值位统一处理;同时加减法也统一处理(CPU只有加法器,将减法变成加负数计算)。

--最后打印输出转化为原码


4. 移位操作符

  • <<左移
  • >>右移

--操作数只能是整数

4.1 左移

--规则:左边抛弃,右边补0;

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int num1 = 10;
	//左移一位
	int num2 = num1 << 1;
	printf("%d\n", num1);
	printf("%d\n", num2);
	return 0;
}
//00000000000000000000000000001010——>num1补码——>10
//00000000000000000000000000010100——>num2补码——>20

4.2 右移

--规则:

  1. 逻辑右移:右边丢弃,左边补0;
  2. 算术右移:右边丢弃,左边有原符号值填充;

--(逻辑右移/算术右移取决于编译器,VS2022中是算术右移。)

代码语言:javascript
复制
int main()
{
	int num1 = 10;
	//右移一位
	int num2 = num1 >> 1;
	printf("%d\n", num1);
	printf("%d\n", num2);
	return 0;
}
//00000000000000000000000000001010——>num1补码——>10
//00000000000000000000000000000101——>num2补码——>5

--num = -1

--注意:移位操作符,不能移动负数,未定义!


5. 位操作符:&、|、^、~

5.1 位操作符初步使用

--位操作符有:

  • &——按位与:对应位均为 1 时结果为 1,否则为 0。
  • | ——按位或:对应位至少有一个 1 时结果为 1,否则为 0。
  • ^——按位异或:对应位不同时结果为 1,相同时为 0。
  • ~——按位取反:所有位取反(包括符号位)。

--操作数必须是整数

--运行代码,直观了解一下:

代码语言:javascript
复制
int main()
{
	int num1 = -3;
	int num2 = 5;
	printf("%d\n", num1 & num2);——>5
	//10000000000000000000000000000011——num1原
	//11111111111111111111111111111100——num1反
	//11111111111111111111111111111101——num1补
	// 
	//00000000000000000000000000000101——num1&num2补——>5
	// 
	//num2补:00000000000000000000000000000101

	printf("%d\n", num1 | num2);——>-3

	printf("%d\n", num1 ^ num2);——>-8

	printf("%d\n", ~0);——>-1

	return 0;
}

5.2 位操作符相关练习

5.2.1 题1:不能创建临时变量(第三个变量),实现两个整数的交换
代码语言:javascript
复制
int main()
{
	int num1 = 0;
	int num2 = 0;
	printf("请输入进行交换的数值:");
	scanf("%d%d", &num1, &num2);
	printf("num1 = %d num2 = %d\n", num1, num2);

	num1 = num1 ^ num2;
	//num1'=num1^num2
	num2 = num1 ^ num2;
	//num2'=num1'^num2=num1^num2^num2=num1
	num1 = num1 ^ num2;
	//num1=num1^num2^num1

	//a^a=0;a^0=a;
	//支持交换律
	printf("num1 = %d num2 = %d\n", num1, num2);
	return 0;
}

补充: --a^a=0;a^0=a; --支持交换律;


5.2.2 题2:编写代码实现——求一个整数存储在内存中的二进制中1的个数
代码语言:javascript
复制
int count_bits1_of_n(int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		//循环进行一次就去掉一个1变成0,直到全为0,结束
		count++;
	}
}

int main()
{
	int num = 0;
	printf("请输入:");
	scanf("%d", &num);
	int ret = count_bits1_of_n(num);
	printf("1的个数时:%d", ret);
	return 0;
}

--这串代码的构思比较难以想到,恰好运用了刚学的知识;一定要勤学、多练!


5.2.3 题3:二进制位置0或者置1
代码语言:javascript
复制
int main()
{
	int a = 13;
	a = a | (1 << 4);
	printf("a=%d\n", a);
	a &= ~(1 << 4);
	printf("a=%d\n", a);
	return 0;
}

6. 逗号表达式

--形式:

代码语言:javascript
复制
exp1, exp2, exp3, …expN

--逗号表达式:用","将多个表达式隔开,从左向右依次执行,有实际意义的表达式进行计算,但只有最后表达式的结果位整个表达式的结果。

代码语言:javascript
复制
int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, b = a + 1);
	//a=b+10有意义计算出a值,最后的表达式起作用,并延用a值
	printf("%d\n",c);
	return 0;
}

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

7.1 下标访问

--这个操作符在前面数组部分涉及到;比如arr[ 9 ] = 10,操作符的操作数就是arr、9.

7.2 函数调用

--这个没啥可说的,直接看代码理解:

代码语言:javascript
复制
int Add(int x, int y)
{
	return x + y;
}

int main()
{
	printf("hehe\n");
	int r = Add(3, 5);
	printf("%d\n",r);
	return 0;
}

--操作数:函数名、参数都是操作数。

结语:本篇文章分享了关于操作符的一些知识,其中有旧知识也有新知识,一定要好好理解;下篇文章将会接着把操作符剩余部分知识进行分享。如果这篇文章对你的学习有帮助的话,欢迎一起讨论学习,你这么帅给个三连吧~~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 1. 操作符分类
  • 2. 二进制和进制转换
    • 2.1 2进制转10进制
      • 2.1.1 10进制转2进制数字
    • 2.2 2进制转8进制、16进制
      • 2.2.1 2进制转8进制
      • 2.2.2 2进制转16进制
  • 3. 原码、反码、补码
  • 4. 移位操作符
    • 4.1 左移
    • 4.2 右移
  • 5. 位操作符:&、|、^、~
    • 5.1 位操作符初步使用
    • 5.2 位操作符相关练习
      • 5.2.1 题1:不能创建临时变量(第三个变量),实现两个整数的交换
      • 5.2.2 题2:编写代码实现——求一个整数存储在内存中的二进制中1的个数
      • 5.2.3 题3:二进制位置0或者置1
  • 6. 逗号表达式
  • 7. 下标访问 [],函数调用 ()
    • 7.1 下标访问
    • 7.2 函数调用
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档