1. 操作符的分类
二进制和进制转换
进制就是数字不同的表达形式而已
十转二
余数从下往上写
熟悉之后直接凑就好了,没必要一下一下算
二转八
每三个二进制位,换算成一个八进制
注意:一个数字的开头是0,没被认为是八进制数字
二转十六
每四个二进制位,换算成一个十六进制
注意:十六进制表示在前面加0x
原码、反码、补码
概念搞清楚
负数所以三个不相同,正数知道一个就全知道了
对于整形来说:数据存放内存中其实存放的是补码。
** 算一个数,就是占4个字节,32个bit位**
移位操作符——移动的是二进制位
左移
像这样移动完,a,b的值到底是多少呢?
首先需要把a的二进制写出来
记住一个整数的二进制是4个字节 32个bit位
所以0000000000000000000000000000000110
因为6是正数,所以原码反码补码相同
向左移动一位,左边抛弃,右边补0
所以b的二进制末尾就是1100=12
左移一位有乘2的效果
负数也一样
右移操作符
到底是算术右移还是逻辑右移,取决于编译器,大部分都是算术右移
可以记一下
如果是逻辑右移,就变成负数了,因为是左边补0
常见的编译器都是算术右移,所以这里就不展示效果了
如果是算术右移,直接在左边补符号位,不会改变正负
重点:对于两种移位操作符来说两边必须是整数且移动的位数不得为负
这是个特例,-1右移后还是-1
大部分情况下,右移有除2的效果
复合起来写
位操作符
区分一下
1.按位与
上下两个数进行与运算,有0就是0,全1才是1
得到补码后通过取反+1,得到原码才能确定结果
把两个数的补码写出来,做相应的运算就好
2.按位或同理
3.按位异或
还是补码之间的运算,看到一个数先写原码,转化成补码
异或:相同为0,相异为1
4.按位取反
我们之前接触过的!,就是逻辑取反
~:就是对这个数的二进制所有取反
操作数必须是整数
一道面试题
思路1:
这样写右移i次,就会让每一位都到最后一位与1进行与运算,来判断它是不是1
对于操作符的运用在嵌入式中很常见
一个算法
有几个一,这个算法就运行几次,就去掉几个一
-1的原码就是32个1,所以根据这个算法得出了有多少个1
这个算法不容易想到
练习题
只要把第五位的位置或上1,其他位置或上0就可以
按位或
转化为1后,就只有第5个与上0,其他与上1,然后按位取反,再1<<4,我嘞个豆啊
逗号表达式
每个表达式依次运算
整个表达式的结果就是最后一个表达式的结果