【C语言篇】操作符详解(下篇)

2024-10-09 19:01:16 浏览数 (2)

操作符详解(下篇)

前言

操作符详解(上篇)

条件操作符

条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:

代码语言:javascript复制
 exp1 ? exp2 : exp3

如果表达式1为真,那么就计算表达式2,表达式2的结果为整个式子的 结果;如果表达式1为假,那么就计算表达式3,表达式3的结果为整个式子的结果。

例如求两个数的最大值

代码语言:javascript复制
#include<stdio.h>
int main()
{		
   int a = 0, b = 0, c = 0;
   printf("请输入两个数:n");
   scanf("%d %d", &a, &b);
   c = a > b ? a : b;
   printf("较大的数为:%dn", c);
   return 0;
}

移位操作符

这涉及到数据在内存中的存储形式

不了解的小伙伴可以先去看这篇: 【C语言篇】数据在内存中的存储(超详细)

<<左移操作符

>>右移操作符

移位操作符的操作数只能是整数

左移操作符

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

代码语言:javascript复制
#include <stdio.h>
int main()
{
    int num = 10;
    int n = num<<1;
    printf("n= %dn", n);
    printf("num= %dn", num);
    return 0;
}
右移操作符

移位规则:⾸先右移运算分两种:

  1. 逻辑右移:左边⽤0填充,右边丢弃
  2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
代码语言:javascript复制
#include <stdio.h>
int main()
{
     int num = 10;
     int n = num>>1;
     printf("n= %dn", n);
     printf("num= %dn", num);
     return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

警告⚠⚠:对于移位运算符,不要移动负数位,这个是标准未定义的。

一般更多采用算术右移

位操作符

位操作符有:

代码语言:javascript复制
& //按位与
| //按位或
^ //按位异或
~ //按位取反

注:他们的操作数必须是整数。

  • 按位与&
    • 对应的二进制位,有0则为0,两个同时为1,才为1
  • 例子如下:
代码语言:javascript复制
/int main()
//{
//	int a = 6;
//	//00000000000000000000000000000110 - 6的补码
//	//
//	int b = -7;
//	//10000000000000000000000000000111
//	//11111111111111111111111111111000
//	//11111111111111111111111111111001 -> -7的补码
//
//
//	int c = a & b;//a和b的补码的二进制位进行运算
//	//对应的二进制位,有0则为0,两个同时为1,才为1
//	// 
//	//00000000000000000000000000000110 - 6的补码
//	//11111111111111111111111111111001 -> -7的补码
//	//00000000000000000000000000000000
//	printf("%dn", c);
//
//	return 0;
//}
  • 按位或|
    • 对应的二进制位,有1则为1,两个同时为0,才为0
  • 按位异或^
    • 对应的二进制位,相异为1,相同为0
  • 按位取反~
    • 对应二进制位,1变为0,0变为1

不能创建临时变量(第三个变量),实现两个整数的交换。

代码语言:javascript复制
#include <stdio.h>
int main()
{
     int a = 10;
     int b = 20;
     a = a   b;
     b = a - b;
     a = a - b;
     printf("a = %d b = %dn", a, b);
     return 0;
}  

这种方法在数据较大时会发生溢出

  • 使用异或操作
    • 0和任何数异或都是任何数本身
    • 异或满足交换律和结合律
    • 任何数异或自己都是0
代码语言:javascript复制
#include <stdio.h>
int main()
{
     int a = 10;
     int b = 20;
     a = a^b;
     b = a^b;
     a = a^b
     printf("a = %d b = %dn", a, b);
     return 0;
}     

求一个整数在内存中存储二进制1的个数

  • 方法一:十进制转二进制每次除二,余1则count
  • 注意传过来的参数要转为unsigned int,否则负数统计会出现错误
代码语言:javascript复制
int count_bit_one(unsigned int n)
{
	int count = 0;
	while (n)
	{
		if ((n % 2) == 1)
			count  ;

		n = n / 2;
	}
	return count;
}
  • 方法二:
  • 使用移位操作符
  • 这里必须循环32次,还可以优化
代码语言:javascript复制
#include <stdio.h>
int count_bit_one(int n)
{
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i  )
	{
		if (((n >> i) & 1) == 1)
		{
			count  ;
		}
	}
	return count;
}