微信号:cpp_coder

介绍:最专业的C/C++编程学习和程序员发展的综合平台.提供C/C++、汇编语言等、STL、MFC、QT等等学习、数据结构算法思维分析、各领域项目经验分享、资源下载、招聘和资讯的综合服务.

深入浅出一举拿下晦涩的高位低位和左移右移

2018-08-28 09:24 codexia

      高位低位和古人云的上座下座或者左席右席有异曲同工之妙,大道至简,只有到足够高的层面,才能将各种概念打通,融会贯通。那么左移右移又类似与升官发财节节攀升以及仕途不顺连续被贬官。从官场的升级和降级,也可以对照出我们这里的高位低位以及左移和右移的概念了。所谓一通百通,此之谓也。

        我们按照一个字节来理解高位、低位、左移和右移几个概念。

高位和低位
    一个字节即8个比特位(bit),一个比特位即0或者1。如数字1是一个字节表示出来的整数,用比特位表示就是:00000001
    高位和低位从数学上理解就是,个十百千万...个是低位,十是相对的高位,越往后面位越高。其实位高位低就看这个为的权重是大是小。123,1是百位,2是十位,3是个位,
    所以分别代表着权重10的2次方、10的一次方和10的0次方。权重的值越大,表示这个数字背后的实力越强大。表面上是1、2、3三个数字,好像只隔了一个数大小而已。
    举一个实际的例子来理解,富二代出身的人和平民出身的人,看上去好像是一个人在穿着的差别,然而实际上是整个家族实力的悬殊。在人类社会里有一句叫做位高权重,此之谓也。
    位高权重在进制的高位和低位是一样的意思,不要看表面的数字,这个数字所在的位置不一样,权重就不一样。那么这个位置就是大家去制定的公认的表示方法。
    比如在家里坐席吃饭,上位表示最高低位的意思,两边则是附宾,下位是低位最低的,一般是主人陪坐。【这个不一定完全正确,个人理解】那么这个规定是谁规定的呢?国家两千年历史形成的。
    本来座位上4个方位就只是物理上的位置而已,却由人类赋予了不同的含义。这就是位被指定的背后意义。那么这个背后意义,也就隐藏了权重的含义。
    也就是说,位高位低是人为的规定而已。所以规定,可以有不同的方式。可能在中国上位表示最尊贵,可能在另一个国度里,上位表示最卑贱。这由具体的文化来决定。但是不管怎么样,
    总会有一个高位和低位的,只是规定的位置不一样而已。
    那么在进制里的高位低位,同样如此。在数学里,123,最高位是1,最低位是3。为什么会这样呢?人为(数学家)规定的!而在00000001二进制表示中,最左边是最高位,最右边也是最低位。
    这是书写上和数学保持一致,方便理解。
    然而在计算机中,万事从0开始。也就是说,0位是最低位。而计算机内存的排列,我们从左到右依次是第0位、第1位...,这样一来,在内存的二进制表示法中,我们手写的00000001会表示成10000000.
    实际上这两种只是表示的差异而已,是一样的数字1.这就是人为规定的不同的表示方法而已。和前面说的上位是一个道理,都是人为规定的一套表示方法。而不管在哪种表示方法中,都有低位和高位。
    手写的00000001中1所在的位置是最低位(大端排序,即高位在左),计算机内存表示的10000000中的1所在的位置是最低位(小端排序,即低位在左)。
    我们需要清晰的知道,在哪里是哪种表示方式,然后就可以准确识别高低位了,否则就很乱了。
左移和右移
    前面已经解释了,不同的位代表不同的权重,在二进制中,权重是以2的次方来表示的。权重越大,2的次方就越大。最低位就是2的0次方,高一位是1次方,以此类推。
    那么每一个位也就代表了一个权位,只要到达这个位,就进入了一个权位,那么这个数字背后的权重就变成了这个位的权重了。不同的权位之间的切换,也就是通常说的进位和降位。
    我们通常用数学的运算来进位降位,比如10进制中,加法超过了9就进位到了十位,超过了99就进位到了百位。进位后只看到一个数字1,然而这个1就是比之前的9和99大,也就是它的权重高。
    通过减法,我们将数字降到99就要从百位中退回十位,原先是100,1代表百位,减一之后,不够100,水平不一百位就降位为十位,也就变成99了。
    这是我们通常的理解,通过运算来进位和降位。然而回归到进制的本质,其实也就是位的向左移动一个位置还是向右移动一个位置而已。如果1在各位,就代表个数的1,如果移到相邻的十位,就代表10了,再次移到百位,就代表100了。
    这就是移位的原理。我们不需要通过计算就可以直接变换位置,更换权重。所以1*10=10,1*100=100,等价于将1移动到十位,将1移动到百位。
    对于计算机来讲,移动一个比特位,比计算乘法快的多。乘法需要乘法器的硬件支持,而移位则不需要额外的硬件支持。在对数字的按位权重的乘法和除法就可以直接用移位来完成,快捷方便。而对于非权重位倍数的乘法除法则不方便用移位。
    这是移位在乘法和除法的应用。大多时候,我们移位只是将比特位作为最小的单位进行数据存储,所以需要通过移位操作来操作每一个比特位。因为直接操作的最小单位是字节,字节包含了8个比特位。
    我们不能直接读写比特位,所以需要使用一个手段去间接操作一个比特位。这样就是位移操作的作用了。通过移位之后,形成交错的不同的比特位矩阵,然后通过位或、位与、位非、异或等位操作实现将多余的位屏蔽掉,将操作的位留下,这样就可以间接操作了比特位,最后还原成操作之后的数字。
    所以,左移右移和位操作是紧密相关的。而应用一方面用于乘法除法的快捷实现,另一方面就是比特位的操作。

    实际上,高位低位和左移右移,都是比特位的特性产生的一些概念。当然,高位低位与进制也是相关的。我们这里说的高位低位是更加通用的高低位,不一定关联到某一种进制,只是表示一个排列顺序而已。


    关注公众号【CPP技术网】,看更多干货文章。

 
CPP技术网 更多文章 公众号免费开会员第二次通报 公众号免费开会员通报 一个从工厂产线员工走向IT的中年程序员 nginx负载均衡的配置的实战说明 小白也能理解的反向代理和负载均衡的区别分析
猜您喜欢 从房价上涨,来818你为何要选择浪潮整机柜? 一天300万阅读的文章是如何写出来的 Redex 初探与 Interdex:Andorid 冷启动优化 Android端外推送到底有多烦? 揭秘年赚百万的暴利小项目有哪些