1.关于移位操作符的补充
左移操作符:左边丢弃,右边补0
右移操作符:①:逻辑右移
左边用零填空,右边丢弃
②:算术右移
左边用该值的符号填充,右边丢弃
2.关于位操作符的疑难点和记忆
请以下四位角色出场 ——> & | ^ ~
第一个printf:
-3:100000000000000000000000000000011
5:000000000000000000000000000000101
这是-3小姐和5先生的原码
在进行计算前,负数要先转化为补码,(正数的补码与原码一致)
-3小姐的补码为:
11111111111111111111111111111101
补码转原码符号位是不变的,也就是第一个数字不变,而且还记得要取反+1,+1很容易被忘记
然后按位与(其实类似于真假的关系,1表示真,0表示假,逻辑就像&&一样,都是真才为真(都是1则是1),有假则都为假(两边有0则为0)
&结果:0000000000000000000000000000101
我们想要知道结果是哪个数字,则要把它转化为原码,但又因为开头那个数字也就是符号位是0,也就正数三个码都相同,所以说我们通过这串数字就可以直接推出数字是什么
第二个printf:
则是按位或 | , 规则:只要有1就是1两个同时为0则为0。
我们跳过中间步骤直接得到结果
:111111111111111111111111111111101
注意这里的符号位,也就第一个数字是1
那么我们需要把这串补码转化为原码
:100000000000000000000000000000010
再加1
:100000000000000000000000000000011
这样我们就可以推出数字来
第三个printf~记忆
是按位异或,我们可以把它想象成一个穿针游戏
1就是针,零就是孔
1碰1为0,1碰0穿过为1,0碰0为0
第四个printf
是按位取反,全部取反,(除了~全部取反,其他的取反,符号号位是终是不变的)
而且需要注意,我们拿来操作的数字,要看他的二进制数,开头是1还是0,是0就不用管是1就需要转换为补码,结果也是一样,如果结果的二进制数开头是1则需要把它转化,
3.关于结构体的疑难点:
结构体更像是一个集合,把你要用的一些类型值变成一个集合,你想用的时候就能用,而不是单一的局限为一个类型
首先结构的声明:
struct a (随意的名字(ー_ー)!!)
{
member-list;----->成员列表
}
variable-list;------>变量列表
变量列表可以为0,但是成员列表必须有值
比如描述一个学生的值
用结构的话,你就会很方便,想调用哪个类型的值就能调用,
关于它的定义的话,有两种方法,但一种是全局变量,一种是局部变量
。゚+.ღ(ゝ◡ ⚈ღ)