+ - * / %数组
注意:函数
规则:
按二进制形式把全部的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。3d
例: 3 << 2
计算过程:
指针
数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都至关于乘以2的1次方,左移n位就至关于乘以2的n次方。code
规则:
按二进制形式把全部的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。blog
例1:11 >> 2
计算过程:
数学
例2:-7 >> 2
计算过程:
io
数学意义:
右移一位至关于除2,右移n位至关于除以2的n次方。table
注意:移位操做符不能移动负数位class
& :按位与(相同位置只有都为1才为1)
| :按位或(相同位置要有一个位为1就为1)
^ :按位异或(相同位置相同为0,不一样则为1)
注意:他们的操做数都必须是整数,按位故而须要按照整数的二进制每位操做,
1.求一个整数二进制中1的个数?
//方法一 int CountOfNum1(int num) { int count = 0; while (num > 0) { if (num % 2 == 1) count++; num = num / 2; } return count; } //方法二 int CountOfNum2(int num) { int count = 0; int i = 0; for (i = 0; i < 32; ++i) { //把每一位右移到最右边和1按位与,统计1出现的次数 if (((num >> i)&1) == 1) { count++; } } return count; } //方法三(最优) int CountOfNum3(int num) { int count = 0; while (num) { count++; num = num&(num - 1); } return count; }
2.不能建立临时变量(第三个变量),实现两个数的交换
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); system("pause"); return 0; }
赋值操做符比较简单,就是给变量赋值,比较常见的就是咱们在对一个已经被赋值的变量进行修改,直接将这个变量直接赋值成你想要的
例如:
int a = 0; a = 10;
+= -= /= *= %= >>= <<= &= |= 等等
操做符 | 名称 |
---|---|
! | 逻辑反操做符 |
- | 负号 |
+ | 正号 |
& | 取地址 |
-- | 自减 |
++ | 自增 |
~ | 按位取反 |
* | 解引用、间接访问 |
sizeof | 类型长度 |
(类型) | 强制类型转换 |
注意:结合使用时必定要搞清楚优先级,若是不清楚,手动加上括号来控制
符号 | 名称 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于等于 |
!= | 不等于 |
int main() { int a = 3; printf("%d", a += a-= a * a); return 0; } 输出结果 -12 作题思路: 因为每次都须要将后面的值算出来才能进行-=和+=,故此题是按照从右向左计算的,为了方便理解,咱们能够拆分计算 a += (a -= a*a) a -= (a*a) b = a*a=9 a -= (a*a)--> a -= b---> a = -6(注意此时a的值已是6了,后面运算时a的值都以6计算) a += (a -= a*a)---> a += a ---> -6+(-6)=-12
&& 逻辑与(“而且”):两个操做数都为真,结果才为真
|| 逻辑或(“或者”):全部操做数都为假时才为假,有一个或者多个操做数为真就为真
注意:区分逻辑与/或 和 按位与/或的区别
#include <stdio.h> int main() { int i = 0,a=1,b=2,c =3,d=4; i = a++&&++b&&d++; //i = a++||++b||d++; printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d); return 0; } 输出结果 2,3,3,5 // 2,2,3,4
A ? B : C --- 三元运算符
在某些场景下能够替代if else语句
if(y > 0) x = 1; else x = 0;
以上代码等同于下段代码
( y > 0) ? x = 1 : x = 0;
将两个及以上的式子链接起来,整个表达式的值是最后一个表达式的值
例:
int main() { int i = 1; int j = 1; int z = 0; z = i++,j++,++j; //z = (i++,j++,++j); printf("i=%d j=%d z=%d",i,j,z); return 0; } 输出结果 2,3,1 // 2,3,3 解题思路: z = i++,j++,++j;由于=的优先级要高于逗号表达式,因此原式等于(z = i++),j++,++j; 由于后置加加先使用后加加,因此z=1,i=2,j++时j为1,当走到j++后面的,时j已经变成2,++j后就成了3。 同理 z = (i++,j++,++j);()的优先级高于=,因此先算()里的逗号表达式,再算=,因此z=3。
某些场景逗号表达式也可使表达简洁
//while(a > 0) //{ // a = test(); // a++; //} //等价上面代码 while(a = test(), a++, a > 0)
符号 | 功能 |
---|---|
[] | 数组访问 |
() | 函数调用 |
. | 结构体/类 访问成员 |
-> | 结构体/类 指针访问成员 |