c语言如何控制左移次数,汇编/C语言中的逻辑/算数左移/右移操作你真的懂吗

算数左移,逻辑左移,算数右移,逻辑右移有什么不同?

一、算术左移=逻辑左移

说明:算术左移和逻辑左移一样都是右边补0: 比如 00101011

算术左移一位:01010110

逻辑左移一位:01010110

(对于二进制的数值来说左移n位等于原来的数值乘以2的n次方

比如00011010十进制是26,左移两位后是01101000转成十进制是104恰好是26的4倍。)

注:这种倍数关系只适用于左移后被舍弃的高位不含1的情况,否则会溢出。

二、算术右移,逻辑右移

说明:

逻辑右移很简单,只要将二进制数整体右移,左边补0即可,如10101101逻辑右移一位为01010110

算术右移符号位要一起移动,并且在左边补上符号位,也就是如果符号位是1就补1符号位是0就补0 比如:11100算术右移一位为11110(符号位1跟着一起移动并且左边补了1)

(对于二进制的数值来说右移n位等于原来的数值除以2的n次方

比如10110100十进制是76(需要先将这个补码转换成原码之后再转换成十进制),右移两位后是11101101转成十进制是19恰好是76的1/4倍。)

三、总结

算术左移和算术右移主要用来进行有符号数的倍增、减半;

逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半。

汇编语言中的左移右移规则是什么样的?

**说明:**移位指令包括了 算术移位指令、逻辑移位指令、循环移位指令。

一、算术移位指令

1、算术左移指令SAL

**功能:**左移一次,最低位补0,最高位送入CF标志位,如图:

uxwPHF6emnscDR4vLy41jg7vHq6sNY4Pr27OyYdRaLUrDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssL6u+k+AAQCR9eHtLKvLfwAAAABJRU5ErkJggg==

**意义:**左移n次,等于x2的n次幂。所以可用于有符号操作数做x2的n次幂运算。

2、算术右移指令SAR

**功能:**右移一次,最高位保持不变,最低位送入CF标志位,如图:

uxwPHF6emnscDR4vLy41jg7vHq6sNY4Pr27OyYdRaLUrDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssL6u+k+AAQCR9eHtLKvLfwAAAABJRU5ErkJggg==

**意义:**右移n次,等于/2的n次幂。所以可用于有符号操作数做/2的n次幂运算。

二、逻辑移位指令

1、逻辑左移SHL

**功能:**同SAL,如图:

uxwPHF6emnscDR4vLy41jg7vHq6sNY4Pr27OyYdRaLUrDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssL6u+k+AAQCR9eHtLKvLfwAAAABJRU5ErkJggg==

**意义:**同SAL

2.逻辑右移SHR

**功能:**右移一次,最高位补0.区别!最低位送入CF标志位。如图:

uxwPHF6emnscDR4vLy41jg7vHq6sNY4Pr27OyYdRaLUrDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssL6u+k+AAQCR9eHtLKvLfwAAAABJRU5ErkJggg==

**意义:**用于实现无符号数/2的n次幂操作。

三.循环移位指令

1.循环左移指令ROL

**功能:**左移一次,左移前的最高位送入最低位以及CF.如图:

uxwPHF6emnscDR4vLy41jg7vHq6sNY4Pr27OyYdRaLUrDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssL6u+k+AAQCR9eHtLKvLfwAAAABJRU5ErkJggg==

2.循环右移指令ROR

**功能:**右移一次,右移前的最低位送入最高位以及CF.如图:

uxwPHF6emnscDR4vLy41jg7vHq6sNY4Pr27OyYdRaLUrDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssL6u+k+AAQCR9eHtLKvLfwAAAABJRU5ErkJggg==

3、带进位的循环左移RCL

**功能:**左移一次,左移前的最高位送入CF,CF的内容送入最低位.如图:

uxwPHF6emnscDR4vLy41jg7vHq6sNY4Pr27OyYdRaLUrDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssL6u+k+AAQCR9eHtLKvLfwAAAABJRU5ErkJggg==

4.带进位的循环右移RCR

**功能:**右移一次,右移前的最低位送入CF,CF的内容送入最高位.如图:

uxwPHF6emnscDR4vLy41jg7vHq6sNY4Pr27OyYdRaLUrDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssMCiwAILLLDAAosCCyywwAILLAossMACCyywKLDAAgsssL6u+k+AAQCR9eHtLKvLfwAAAABJRU5ErkJggg==

C语言中的左移右移规则是什么样的?

一、验证参见下面链接资料

二、总结

左移就是: 丢弃最高位,0补最低位

右移:对于有符号整数来说,比如int类型,右移会保持符号位不变

(在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变,相当于汇编的算术右移)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值