现在的位置: 首页 > 综合 > 正文

算术移位与逻辑移位有什么不同

2017年11月05日 ⁄ 综合 ⁄ 共 1851字 ⁄ 字号 评论关闭

算术移位与逻辑移位有什么不同之处,最好能给出一个例子演示一下,谢谢了

检举|2011-09-02
13:16菲诺飞流 | 分类:汇编语言 | 浏览5513次
提问者采纳
2011-09-02 13:25
(转自romway的博客,自己写这么多太累!)
什么叫逻辑移位和算术移位  

1)算术移位 当乘数或除数是2n时,算术移位用来快速地完成对整数进行乘法或除法的运算。算数左移n位相当于乘上2n,执行方法是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补0。
2)逻辑移位 逻辑左移n位的执行方法,是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补"0"。 逻辑右移n位的执行方法是把原来数中的每一位都向右移动n个位置,右面移出的低位丢弃不要,左面高位空出的位置上全部补0。

逻辑移位:不考虑正负号  
  算术移位:考虑正负号。  
   
  e   g:             1000000000000000(右移2位)       0000000000000000(左移2位)      
  逻辑移位:0010000000000000                         0000000000000000  
  算术移位:1110000000000000                         1000000000000000  
   
  注:算术右移时,最前面是1时,补1,否则,补0。逻辑左移时,补0。    
          逻辑移位时,不用保留正负号(第一个),统一补0。

逻辑移位(不管是左移位还是右移位)   都是空缺处补0  
   
  例如:     mov   ax   ,   1100_0111_0110_1000B  
                  mov   cl   ,   3  
                  shl   ax   ,   cl                                     ;   结果     ax   =   0011_1011_0100_0000  
   
                  mov   ax   ,   1100_0111_0110_1000B  
                  mov   cl   ,   3  
                  shr   ax   ,   cl                                     ;   结果     ax   =   0001_1000_1110_1101  
   
  算术移位要保证符号位的不改变(算术左移位补0,   算术右移位看符号位)  
   
  例如:     mov   ax   ,   1100_0111_0110_1000B  
                  mov   cl   ,   3  
                  sal   ax   ,   cl                                     ;   结果     ax   =   0011_1011_0100_0000  
   
                  mov   ax   ,   1100_0111_0110_1000B  
                  mov   cl   ,   3  
                  sar   ax   ,   cl                                     ;   结果     ax   =   1111_1000_1110_1101  
   
                  mov   ax   ,   0100_0111_0110_1000B  
                  mov什么叫逻辑移位和算术移位  

2008-01-29 16:53:18|  分类: 计算机软考 |字号 订阅

1)算术移位 当乘数或除数是2n时,算术移位用来快速地完成对整数进行乘法或除法的运算。算数左移n位相当于乘上2n,执行方法是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补0。
2)逻辑移位 逻辑左移n位的执行方法,是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补"0"。 逻辑右移n位的执行方法是把原来数中的每一位都向右移动n个位置,右面移出的低位丢弃不要,左面高位空出的位置上全部补0。

逻辑移位:不考虑正负号  
  算术移位:考虑正负号。  
   
  e   g:             1000000000000000(右移2位)       0000000000000000(左移2位)      
  逻辑移位:0010000000000000                         0000000000000000  
  算术移位:1110000000000000                         1000000000000000  
   
  注:算术右移时,最前面是1时,补1,否则,补0。逻辑左移时,补0。    
          逻辑移位时,不用保留正负号(第一个),统一补0。

逻辑移位(不管是左移位还是右移位)   都是空缺处补0  
   
  例如:     mov   ax   ,   1100_0111_0110_1000B  
                  mov   cl   ,   3  
                  shl   ax   ,   cl                                     ;   结果     ax   =   0011_1011_0100_0000  
   
                  mov   ax   ,   1100_0111_0110_1000B  
                  mov   cl   ,   3  
                  shr   ax   ,   cl                                     ;   结果     ax   =   0001_1000_1110_1101  
   
  算术移位要保证符号位的不改变(算术左移位补0,   算术右移位看符号位)  
   
  例如:     mov   ax   ,   1100_0111_0110_1000B  
                  mov   cl   ,   3  
                  sal   ax   ,   cl                                     ;   结果     ax   =   0011_1011_0100_0000  
   
                  mov   ax   ,   1100_0111_0110_1000B  
                  mov   cl   ,   3  
                  sar   ax   ,   cl                                     ;   结果     ax   =   1111_1000_1110_1101  
   
                  mov   ax   ,   0100_0111_0110_1000B  
                  mov   cl   ,   3  
                  sar   ax   ,   cl                                     ;   结果     ax   =   0000_1000_1110_1101
提问者评价
谢谢了,解决我的大问题

c与C++都是>>都是逻辑移位,是针对unsigned design
但是Java有 >>,与>>>

抱歉!评论已关闭.