简言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语言中的位运算符包括左移运算符(<<)、右移运算符(>>)、按位与运算符(&)、按位或运算符(|)和按位异或运算符(^)。其中左移运算符和右移运算符可以用来对一个数进行位移操作。无符号数的左移右移是指将一个无符号数的二进制表示向左或向右移动指定的位数,移动后的空位用0填充。下面是一个无符号左移的例子: 引用:例子二:无符号数的左移 #include <stdio.h> int main(){ unsigned int a = 0x80000001; int i=0; for(;i<64;i++){ printf("left %d:%08x,%u\n",i,a<<i,a<<i); } } 在这个例子中,我们定义了一个无符号整型变量a,并将其初始化为0x80000001。然后我们使用for循环对a进行了64次左移操作,每次左移的位数从0到63。在每次左移后,我们使用printf函数输出了左移的位数、左移后的结果以及结果的十进制表示。可以看到,每次左移后,a的值都会乘以2的移动位数次方。 无符号数的右移是指将一个无符号数的二进制表示向右移动指定的位数,移动后的空位用0填充。下面是一个无符号右移的例子: 引用:例子四:无符号数的右移 #include <stdio.h> int main(){ unsigned int a = 0x10000001; int i=0; for(;i<64;i++){ printf("left %d:%08x,%u\n",i,a>>i,a>>i); } } 在这个例子中,我们定义了一个无符号整型变量a,并将其初始化为0x10000001。然后我们使用for循环对a进行了64次右移操作,每次右移的位数从0到63。在每次右移后,我们使用printf函数输出了右移的位数、右移后的结果以及结果的十进制表示。可以看到,每次右移后,a的值都会除以2的移动位数次方。 需要注意的是,对于有符号数的左移右移,如果移动后的空位用符号位填充,那么就会出现符号位溢出的问题。例如,如果将一个有符号整型变量i的值左移3位,那么移动后的空位将用符号位填充。如果i的值为8,那么左移3位后,i的值将变为64,而不是24。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值