当前位置:   article > 正文

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

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

操作符详解(下篇)

前言

操作符详解(上篇)


条件操作符

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

 exp1 ? exp2 : exp3
  • 1

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

例如求两个数的最大值

#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("较大的数为:%d\n", c);
   return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

移位操作符

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

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

<<左移操作符

>>右移操作符

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

左移操作符

移位规则:左边抛弃、右边补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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

右移操作符

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

  1. 逻辑右移:左边⽤0填充,右边丢弃
  2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
#include <stdio.h>
int main()
{
     int num = 10;
     int n = num>>1;
     printf("n= %d\n", n);
     printf("num= %d\n", num);
     return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

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

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

一般更多采用算术右移

位操作符

位操作符有:

& //按位与
| //按位或
^ //按位异或
~ //按位取反
  • 1
  • 2
  • 3
  • 4

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

  • 按位与&
    • 对应的二进制位,有0则为0,两个同时为1,才为1
  • 例子如下:
/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("%d\n", c);
//
//	return 0;
//}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 按位或|
    • 对应的二进制位,有1则为1,两个同时为0,才为0
  • 按位异或^
    • 对应的二进制位,相异为1,相同为0
  • 按位取反~
    • 对应二进制位,1变为0,0变为1

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

#include <stdio.h>
int main()
{
     int a = 10;
     int b = 20;
     a = a + b;
     b = a - b;
     a = a - b;
     printf("a = %d b = %d\n", a, b);
     return 0;
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

  • 使用异或操作
    • 0和任何数异或都是任何数本身
    • 异或满足交换律和结合律
    • 任何数异或自己都是0
#include <stdio.h>
int main()
{
     int a = 10;
     int b = 20;
     a = a^b;
     b = a^b;
     a = a^b
     printf("a = %d b = %d\n", a, b);
     return 0;
}     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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

		n = n / 2;
	}
	return count;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 方法二:
  • 使用移位操作符
  • 这里必须循环32次,还可以优化
#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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 方法三:
  • 使用&运算符
  • 很巧妙,很难想到
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/945248
推荐阅读
相关标签