操作符(左移,右移操作符,按位与,按位或,按位异或,按位取反,逻辑与,逻辑或)

文章目录

  • 按位取反
  • 左移操作符(<<)
  • 右移操作符(>>)
  • 按位与和按位或(& |)
  • 按位异或(^)
  • 逻辑与和逻辑或(&& ||)

按位取反

~(按位取反):对在内存存储的二进制位(补码)进行按位,把1变成0,0变成1
这就引出了
在这里插入图片描述
如何理解
读取失败返回-1,-1的补码为全1,按位取反变为全0,也就是读取失败时为0,,终止循环

左移操作符(<<)

讲之前必须要提到整数的二进制表现形式:原码,反码,补码
原码:我们实际看到的的值
反码:给原码除符号位(二进制数值的第一位)按位取反
补码:反码+1,数值在内存中实际存储的就是补码
注意正整数的原码反码补码相同
举例
我们拿十进制-7举例其转化成二进制为10000000000000000000000000000111,这就是它的原码,我们给它按位取反,变为11111111111111111111111111111000之后+1得到补码11111111111111111111111111111001这就是它在内存中实际存储的值,
如果不信,int a = -7;可以f10调试,打开内存窗口输入&a,查看
在这里插入图片描述

可以看到是fffffff9,补码二进制转为十六进制四个二进制分一组相加即可算出
移位操作符移动的是补码!!!
将a移动一位放在b中,注意移位操作符不会对a进行实质性改变,就像b = a + 1; a不会变一样
代码和图例如下
在这里插入图片描述
操作符(左移,右移操作符,按位与,按位或,按位异或,按位取反,逻辑与,逻辑或)_第1张图片
将a左移一位,末位补0,移位之后因为我们看到的应该是原码所以我们倒回去,给补码-1然后按位取反也可以继续给补码按位取反+1得到原码,我们采用第一种,给补码-1得到11111111111111111111111111110001之后按位取反得到原码:10000000000000000000000000001110转化为10进制为-14
操作符(左移,右移操作符,按位与,按位或,按位异或,按位取反,逻辑与,逻辑或)_第2张图片

右移操作符(>>)

右移操作分为两种,算术右移和逻辑右移
算术右移:右边丢弃,左边补原来的符号位
逻辑右移:右边丢弃,左边补0
有很多编译器都是采用算术右移的
此处与上文雷同不再过多赘述

按位与和按位或(& |)

两者都是对在内存存储的二进制位(补码)进行按位
按位与:0&1得0,0 & 0得0,1 & 1得1
举例
-7补码: 11111111111111111111111111111001
3补码: 0000000000000000000000000011
按位与:0000000000000000000000000001(符号位是0,代表整数其原反补码都相同)(有0得0,全1得1)
操作符(左移,右移操作符,按位与,按位或,按位异或,按位取反,逻辑与,逻辑或)_第3张图片
按位或:0 | 1得1,1 | 1得1,0|0 得0
-7补码: 11111111111111111111111111111001
3补码: 0000000000000000000000000011
按位或:11111111111111111111111111111011(有1得1,全0得0)

按位异或(^)

^:对在内存存储的二进制位(补码)进行按位异或,相同为0,相异为1
操作符(左移,右移操作符,按位与,按位或,按位异或,按位取反,逻辑与,逻辑或)_第4张图片

逻辑与和逻辑或(&& ||)

&&:有一个为假则为假,两个为真才为真
||:有一个为真则为真,两个为假才为假
我们需要注意**&&如果左操作数为假那么右边操作数无论为真还是假结果都为假,所以右操作数不会计算**
||如果左操作数为真那么右边操作数无论为真还是假结果都为真,所以右操作数不会计算
举例
操作符(左移,右移操作符,按位与,按位或,按位异或,按位取反,逻辑与,逻辑或)_第5张图片

你可能感兴趣的:(C语言初阶进阶全流程讲解,c语言,算法)