前言
重点:
位移操作符和逻辑在操作符
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; }
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; }
----------------------------- 逻辑右移 -------------------------------
------------------------------ 算术右移 ------------------------------
错误输入案例:
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移动就可以,算出所有位数。
原理:
代码实现:
#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种方法:
像这样的:
#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; }
原理:
5. 单⽬操作符
单⽬操作符有这些:
!、++、–、&、、+、-、~ 、sizeof、(类型)
单⽬操作符的特点是只有⼀个操作数,在单⽬操作符中只有&和没有介绍,这2个操作符,我们放在学
习指针的时候学习。
6. 逗号表达式
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。