c语言相关操作符详解

再此之前我们先了解一下数在计算机中存储的规则

原码:直接按照正负数的形式翻译成二进制得到的就是原码

反码:将原码的符号位保持不变,其他位按位取反得到反码

补码:反码+1得到补码

注意:正数和负数的原反补规格不相同,正数的反码补码和原码相同,负数的则遵循以上原则,数据在内存中以二进制补码的形式进行计算

747319bd1e5e4747b8c61e0328ba5092.png

 直观图

af7beead788c4336b804c3bc7e84bd2f.jpg

 

 

1.移位操作符(移动的是二进制数)

1.1 <<左移操作符

移位规则:左边抛弃,右边补0

 

 1.2 >>右移操作符(算数右移)

移位规则:右边抛弃,左边补符号位

/*

现在的编译器都是算数右移,很少逻辑右移(右边抛弃,左边补零)的,左移操作符没什么说的规则都一样

*/

e3ace8b53a0f4bda8e7df92adae4d654.png

注意:所有移位操作符的操作数只能是整数 !

 2. 位操作符 & l ^ ~

2.1   按位与  &

规则: 有0为0,同1为1

0&任何数都为0

一个数按位与自己等于它本身

662ff30e411449a7b2148deefd0637e4.png

 2.2   按位或 I

规则:有1则1,同0则0

1I任何数都得它本身

d9e485432b9241d384281ade4f4ba938.png

 2.3   按位异或  ^

规则:相同为0,相异为1

0^任何数都得它本身

一个数异或它自己等于0

de66c278349647779cbc410ae5871518.png

2.4 按位取反 ~ 

规则:所有位取反

5cd25feae908440bb67798c121f367ae.png

3 实战

看都看到这了来点变态面试题折磨一下你

3.1不能创建临时变量(第三个变量),实现两个整形的交换

解法一

8ae88c747b234f708fca17c239f6ff19.png

 这种方法是最简单最好想的,但是如果数据很大没超出整形的范围该怎么办呢?这种方式就不适应

解法二

1bfd8822050c4dbc8816d96ac00819bc.png

 ^运算时就不存在数据过大而超出的情况

 3.2求一个整形数据在内存中二进制中1的个数

解法1c1101bf141c84a7687d786c050810322.png

 内存中存的是补码,只能计算正数在内存中的二进制1的个数,负数就算不准确,这个代码只能计算出整形数据原码中二进制中1的个数

解法二

 bab8b3dddced4329b68118883701f4b0.png

 

 用>>后&1的值来判断,该位是不是1

解法三

a9f964f7a3e440c1ac20c2cdcd1eaf35.png

n&(n-1) 每次解决一个1

 

 

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熬夜苦读学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值