C语言——从基础到入门之第二篇(左移右移位运算符)

左移右移位运算符

大学的时候就选修过C语言程序设计,还水水的拿了一个C语言二级证书,此后C语言仿佛就与我无关了,知道研究生第二年开始做项目,我才知道这门古老程序语言的重要性。对于数学专业的我而言,matlab确实简单好入门,处理一些数学问题来说得心应手,然而,就有些方面而言,C语言确实要比matlab好很多,最重要的原因当然是因为项目中那些难处理的规模较大的模型本体是C写的,然而翻译成matlab语言工作量实在太大而且运行效率极慢,所以不得不逼着我重新开始学习这一门古老的语言。
为什么第二篇要选择左移右移位运算符来写呢,主要是因为在我重新学习C的道路上第一个让我觉得怀疑我自己是否学过C语言的就是这块了。当然在讲主要内容之前,有一块的内容非常重要,那就是关于有符号的二进制数原码,反码,补码之间的转换了。

原码,反码,补码

首先,我想按我自己的理解说一下这三个分别是什么,对于正整数而言,它的原码和补码是一直的,而反码就是为了求解补码,所以可以不做讨论,只需关注负整数的原码,反码,补码。

原码

一个整数翻译成二进制数,就为这个整数的原码,而转化过程为,首先将绝对值通过不断模2取余,将最后一个因子作为首位之后倒叙补充各个余数所得到的二进制数放在符号位之后,正整数符号位为0,负整数符号位为1,例如

求-125的原码

  1. 125所得到二进制数为: 11111101
  2. -125 符号位取1
  3. -125的原码为: 111111101

反码

反码就是将除符号位以外的其他数字做转变,转变方式为该数位数字若为1,则改为0,反之亦然。继续以-125为例:

-125的原码为: 1 1 1 1 1 1 0 1
-125的反码为: 1 0 0 0 0 0 1 0

补码

补码就是将原码所得到的数加1得到的,这里的加1是在二进制下加1,自然是末位加1,逢1进位了。继续以-125为例:

1 0 0 0 0 0 1 0 + 1 = 1 0 0 0 0 0 1 1

再举一个进位的例子:

-226 原码为:1 1 1 0 0 0 1 0
-226 反码为:1 0 0 1 1 1 0 1
-226 补码为: 1 0 0 1 1 1 1 0

而补码如何转化为原码跟原码转化为补码是一样的。
至于为什么要讲原码,反码,补码,当然与负整数的左移和右移有关了。

左右移符号

左移:<<
左移n位:< 右移:>>
右移n位:>>n

正整数的左右移

规则很简单:

  1. 转原码
  2. 右(左)移 n 位,舍去最后 n 位后再在前 n 位补 0。

例如:

125的原码为: 011111101
125 >>2的原码为:000111111

负整数的左右移

规则相比较正整数有些复杂:

  1. 求解负整数原码。
  2. 求解负整数补码。
  3. 符号位不动,将其余补码按照正整数左右移规则移动,得到移动后的新的补码。
  4. 将补码进行转码为原码。

下面继续以-125为例:

-125的原码为: 1 1 1 1 1 1 0 1
-125的补码为: 1 0 0 0 0 0 1 1
-125 >>2的补码为:1 1 1 0 0 0 0 0
-125 >>2的原码为:1 0 1 0 0 0 0 0

至此,我已经交代清楚了,你懂了吗?

你可能感兴趣的:(C语言——从基础到入门之第二篇(左移右移位运算符))