初入操作符(基础)

简介: 初入操作符(基础)

前言

重点:

位移操作符和逻辑在操作符


1. 操作符的分类

• 算术操作符: + 、- 、* 、/ 、%

• 移位操作符: << >>

• 位操作符: & | ^ `

• 赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=

• 单⽬操作符: !、++、–、&、、+、-、~ 、sizeof

• 关系操作符: > 、>= 、< 、<= 、 == 、 !=

• 逻辑操作符: && 、||

• 条件操作符: ? :

• 逗号表达式: ,

• 下标引⽤: []

• 函数调⽤: ()

• 结构成员访问:. 、->


以上操作符有很多之前就学习过,这篇博客就学习一些没有学习过的


2. 移位操作符

1.<< 左移操作符

2.>> 右移操作符

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

2.1左移操作符

#include <stdio.h>
int main()
{
  int num = 10;
  int n = num<<1;//2进制左移1位
  printf("n= %d\n", n);
  printf("num= %d\n", num);
  return 0;
}

0e9710dbbfab44dfb040cfae0df5db4d.png


2.2 右移操作符

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


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

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

扩展:vs里面是算数右移


案例:


#include <stdio.h>
int main()
{
  int num = 10;
  int n = num>>1;
  printf("n= %d\n", n);
  printf("num= %d\n", num);
  return 0;
}


----------------------------- 逻辑右移 -------------------------------

061fac723a504d6286f932ab4f3e067f.png

------------------------------ 算术右移 ------------------------------

21149f8d84a84583ab1e868fd2258646.png

错误输入案例:


int num = 10;
num>>-1;//error


对于移位运算符,不要移动负数位,这个是编译器未定义的。


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

& --> 按位与

| --> 按位或

^ --> 按位异或

~ --> 按位取反

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

交换变量不创建第三变量:

案例1:


#include <stdio.h>
int main()
{
  int a = 10;
  int b = 20;
  a = a^b;
  b = a^b;//(a ^ b) ^ b == a
  a = a^b;(a ^ b) ^ ( a ) == b
  printf("a = %d b = %d\n", a, b);
  return 0;
}


案例2:


#include <stdio.h>
int main()
{
  int a = 10;
  int b = 20;
  a = a + b;
  b = a - b;//(a + b) - b == a
  a = a - b;//(a + b) - ( a ) == b
  printf("a = %d b = %d\n", a, b);
  return 0;
}


所以说:并不是没有办法,而是看到未知的恐惧,一切的恐惧都来源于实力不足

有关2进制的学习


题目:求⼀个整数存储在内存中的⼆进制中1的个数


分析:2进制中最容易得到的是最后一位,只要 n (整数)& 1,如果 n & 1 == 1,则说明最后一位是 1,反之为 0,

然后n移动就可以,算出所有位数。

原理:

3d9741d39eab43f5981d99a21df0419a.png


代码实现:


#include <stdio.h>
int main()
{
  int num = -1;
  int i = 0;
  int count = 0;//计数
  for(i=0; i<32; i++)
  {
    if((nnm >> i) & 1 == 1)
    //if( num & (1 << i) )//也可以把1向左移动,得到1则加1,0则跳过
    count++; 
  }
    printf("⼆进制中1的个数 = %d\n",count);
    return 0;
}


第2种方法:

8b952fcac5e04870acfb222623b95c04.png

像这样的:


#include <stdio.h>
int main()
{
  int num = 10;
  int count= 0;//计数
  while(num)
  {
    if(num%2 == 1)
    count++;
    num = num/2;
  }
  printf("⼆进制中1的个数 = %d\n", count);
  return 0;
}


第3种方法


#include <stdio.h>
int main()
{
  int num = -1;
  int i = 0;
  int count = 0;//计数
  while(num)
  {
    count++;
    num = num&(num-1);//2进制位每次-1,2进制少一个1,一直到把所有1借出为止
  printf("⼆进制中1的个数 = %d\n",count);
  return 0;
}


这种⽅式是不是很好?达到了优化的效果,但是难以想到


4. ⼆进制位置0或者置1

编写代码将13⼆进制序列的第5位修改为1,然后再改回0


13的2进制序列: 00000000000000000000000000001101
将第5位置为1后:00000000000000000000000000011101
将第5位再置为0:00000000000000000000000000001101


代码演示:


#include <stdio.h>
int main()
{
  int a = 13;
  a = a | (1<<4);//把1向左移动
  printf("a = %d\n", a);
  a = a & ~(1<<4);
  printf("a = %d\n", a);
  return 0;
}


原理:

e9155141e0124753a4a5281229a301a6.png


5. 单⽬操作符

单⽬操作符有这些:

!、++、–、&、、+、-、~ 、sizeof、(类型)

单⽬操作符的特点是只有⼀个操作数,在单⽬操作符中只有&和没有介绍,这2个操作符,我们放在学

习指针的时候学习。


6. 逗号表达式

逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。


相关文章
|
1月前
你真的了解操作符的魅力吗
你真的了解操作符的魅力吗
56 0
|
3月前
|
程序员 C# 开发工具
C#☀️原来高级程序员是这样使用 & 操作符
C#☀️原来高级程序员是这样使用 & 操作符
|
12月前
|
存储 编译器 程序员
c语言(从入门到放弃?NONONO,LET我们一步一步刨析,会发现其中蕴含的乐趣)
c语言(从入门到放弃?NONONO,LET我们一步一步刨析,会发现其中蕴含的乐趣)
70 0
|
Unix 编译器 Linux
抽丝剥茧C语言(中阶)操作符+练习(下)
抽丝剥茧C语言(中阶)操作符+练习
|
存储 编译器 C语言
抽丝剥茧C语言(中阶)操作符+练习(上)
抽丝剥茧C语言(中阶)操作符+练习
|
存储 人工智能 编译器
0基础C语言保姆教学——第五节 数组
在C99之前,这种写法是不允许的,而在C99之后,这种写法是允许的。而我们vs编译器的编译环境并不能很好的支持C99的语法,如果我们在gcc编译器或者其他对新语法更加支持的编译器下,这种写法是可以的。
132 0
0基础C语言保姆教学——第五节 数组
|
前端开发
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符③
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符③
68 0
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符③
|
存储 前端开发 JavaScript
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符②
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符②
95 0
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符②
|
前端开发 C语言
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符①
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符①
69 0
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符①
|
存储 编译器 C语言