1.操作符分类
2.算数操作符
除法操作符:
除数不能为0:
取模操作符:
取模操作符的两边(两个操作数)必须是整数
如果想得到一个数的某一位,可以通过模和除来实现
3.移位操作符
移动的是二进制
如何求原码
一个数的每一位都有其权重,3的权重为10^0,所表示的值为3*10^0,2的权重为10^1,表示的值为2*10^1,1的权重为10^3,表示的值为1*10^3,加起来则为该数的十进制数
二进制同理
若要将10进制数变成2进制数(或者其他进制数),则一个字“凑”
则利用2的不同次方凑和,和为十进制数,通过次方数找到对应的2进制位数
如何表示出原码:
第一位是符号位,总位数为32bit位(二进制位),即一个整型(4个字节)。
正数的原码,反码,补码相同
负数的反码是在原码的基础上符号位(第一位)不变,其他位按位取反;补码等于反码+1;
符号位由正负决定,不会随取补取反改变
如何实现移位操作
算数右移:
将a转换为2进制数,并求出补码,再计算:整体右移,将右边多出部分丢弃,左边空缺用原来的符号位填补。
这里对a的引用不影响a原本的值
左移操作符(无算数左移):原理相同,对补码进行操作,左边丢弃,右边补0。
注意:不能进行负移位
4.位操作符(同样操作二进制位)
按位 &(与)操作
同样对补码进行操作,对应二进制位 有0则为0, 同时为1才为1
正数,补码与原码相同,答案为1*2^0+1*2^1等于3
按位 |(或)操作
同样对补码进行操作,对应的二进制位 有1则为1, 同时为0才为0
补码结果为复数,先减1,再取反得到原码。
按位 ^(异或)操作
对补码进行操作,对应的二进制位 相同为0,相异为1
补码为负,先减1,再取反得到原码
问:不能创建临时变量(第三个变量),实现两个整数的交换
终极解法:
异或运算的运算法则:
a^a -> 0 a^0 = a 异或是支持交换律的
例:实现求一个整数储存在内存中的二进制中的1的个数
思路:
用a&1来判断最低位是否为1(按位&有0则为0,全为1才为1),判断一次,将a右移一次,再判断,判断为1计数器就+1.
5.赋值操作符
连续赋值:(不便于观察和调试)
将y+1的结果赋给x,再将x的值付给a
(更推荐的写法)
复合赋值符
用法:
6单目操作符
6.1介绍
!的使用
同一个意思
flag为假,!flag为真,则打印
如果想表达flag为真,打印
单目操作符只有一个操作数,而双目操作符有两个操作数
&和 * 操作符应用于指针
sizeof
用法
在数组中的用法
~ :对二进制位按位取反
应用:如果想改变某一位
几种继续的方式
后置++
后置--
前置++
前置--
强制类型转化(一般情况下不建议使用)
例:
arr[10]是整型数组,大小为4*元素个数。
char[10]是字符数组,大小为元素个数。
test(arr),test(ch)这样的传参传递的是指针变量(数组首元素arr[0]/ch[0]的地址),sizeof(arr),sizeof(char)都是指针变量的大小,为4/8个字节,对应32/64个bit位。
数组名只有在sizeof和&后面表示整个数组,其他时候都表示首元素地址。
无论什么类型的指针变量大小都是相同的。
7.关系操作符
8.逻辑操作符
&& 并且
| | 或者
例:
&&两边都为真(不为0),结果为1
左边不为真(0),则依次判断右边