简言C语言使用技巧之左移右移符号 的运用

首先,问:这两个符号是干什么用的?

答:右移,左移符号,让当前值右移或者左移

问:怎么用?答:eg:(eg是举个例子的意思)

int a=0xFF//a是十六进制的数,它是存在寄存器里的,对应的二进制数就是1111 1111

a<<1;//a的位变为0x1111 1110,即0xFE了;

注:这里注意,此处a为int型数据,数据类型最大为4个字节,即0xFFFF,此时,若0xa=8000(对应的二进制数为1000 0000 0000 0000),那么,左移一位以后将会变为什么呢? 答案是0000 0000 0000 0000,因为当前数据分配的寄存器放不下,左移一位以后1被舍弃了,末尾自动补零。故唯0,当然不仅可以左移1位也可以左移n位。

eg:

a<<4;//左移四位,

问:右移怎么用呢?

答:当然和左移差不多了,只不过翻过来而已,边界问题也是如此,右移出边界的舍弃,左边空出来的自动补0。明白了吧?

问:那到底这个有什么用呢?

答:用处有以下几个方面:

1,单片机流水灯玩过吧,流水效果简单的一般都是这么控制的,这里不展开说了。如果你不知道,建议找一本单片机书看看上面的说法,一般上面都有介绍。

2,做数据的乘除,例如,一个数据是100,以二进制保存,那么若要乘以2怎么办?100*2?这样当然可行,但会调用CPU的累加器累乘器,不仅慢,还会占用大量的计算资源,特别是当数据量庞大的时候更加明显。而使用移位符号,只需要调用寄存器就可以快速完成计算,是不是快了很多?,所以可以这样理解,数据每左移1位,在不出边界的时候,相当于乘以2,依次类推。同理,右移相当于除以2,

3:在一些算法,包括图像处理等领域,移位符号可应用在矩阵等的相关地方,这里就不说了。

4:这里需要注意一下,如果你存入的数字是带有符号的,即第一位是用0/1来区分的,那么移位的时候需要考虑补的数字是零还是1(即所谓的逻辑位移还是算数位移),具体的和计算机系统相关,相关的知识可以在数电里面查阅,也可以在编程的时候跑一个测试代码看看结果就了解当前环境的定义了。

你可能感兴趣的:(C语言)