C语言——移位操作符与位操作符

本文详细介绍了二进制移位操作符(左移和右移)、位操作符(按位与、或、异或、取反)的工作原理,并通过实例演示如何利用这些操作获取整数的二进制序列以及在面试题中进行数字交换的方法。
摘要由CSDN通过智能技术生成

1.移位操作符

        移位操作符:可以在二进制的基础上对数字进行平移。(注:移位操作符的操作数只能是整数)

1.1左移操作符:<<

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

        接下来我们进行分析:

        根据移位规则可知:输出的n的2进制序列为00010100,化成整数为20,而num的值不变。

1.2右移操作符:>>

        移位规则:1.逻辑右移:左边用0填充,右边丢弃

                          2.算术右移:左边用原该值的符号位填充,右边丢弃

       同上,如果num的值为-1,就会得到以下两种右移。

        无论是移位运算还是位运算,运算编码均为补码,关于原、反、补码可以去看(数据在内存中的存储)一节,文章链接:http://t.csdnimg.cn/1c48z

2.位操作符

2.1按位与(&) 

 运算方法:上下比较,有零则零 ,两个都是 1 才是 1。

2.2按位或(|)

 运算方法:上下比较有 1 则为 1,两个都是 0 才是 0。

2.3按位异或(^)

运算方法:上下比较,相同为 0 ,相异为 1 。

2.4按位取反(~)

运算方法:上下比较,各对应数字取反,1取0,0取1。

        直接上代码:

3.例题分享!!!

例题(1):打印出整数的2进制序列

        

        在思考这道题时,我想到了由于1的补码为00000000 00000000 00000000 00000001,通过循环1<<i再按位与num,就可以使num的每一位都与1进行按位与操作,这样便可以得到num的2进制序列了。

例题(2):不能创建临时变量,实现两个数的交换(一道变态的面试题)

        方法一:若按照常规做法,那实现两个数的交换简直是轻而易举。

        

        方法二:但是题目要求不能创建临时变量,所以有人想到了一种巧妙的方法:

        在这种方法里巧妙地运用了a+b与a-b,也得出了结果。

        下面我们来看方法三。

        在看方法三之前,我们需要先知道关于按位异或的一些公式:

        (1)a ^ a = 0;

        (2)a ^ 0 = a;

        方法三:巧妙使用按位异或及规律得出结果。

        对于方法三我们简单进行分析,第6行a = a ^ b,第7行b = a ^ b = a ^ b ^ b = a ^ 0 = a,第8行a = a ^ b = a ^ b ^ a = 0 ^ b = b,从而达到交换数字的效果。

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

方方·耶格尔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值