0


c语言之移位运算

移位运算

左移

逻辑左移和算数左移的效果是一样的,高位移出,低位补0.

对于一个位长位W的数来说,左移K位。(通常来讲K<W)

高k位移出,低k位补0.

把下面这个w位的位向量左移K位。

     [
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       2
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       3
      
     
    
    
     ,
    
    
     .
    
    
     .
    
    
     .
    
    
     ,
    
    
     
      X
     
     
      3
     
    
    
     ,
    
    
     
      X
     
     
      2
     
    
    
     ,
    
    
     
      X
     
     
      1
     
    
    
     ,
    
    
     
      X
     
     
      0
     
    
    
     ]
    
   
   
     [X_{w-1},X_{w-2},X_{w-3},...,X_3,X_2,X_1,X_0] 
   
  
 [Xw−1​,Xw−2​,Xw−3​,...,X3​,X2​,X1​,X0​]

 
  
   
    
     [
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       k
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       k
      
      
       −
      
      
       2
      
     
    
    
     ,
    
    
     .
    
    
     .
    
    
     .
    
    
     ,
    
    
     
      X
     
     
      3
     
    
    
     ,
    
    
     
      X
     
     
      2
     
    
    
     ,
    
    
     
      X
     
     
      1
     
    
    
     ,
    
    
     
      X
     
     
      0
     
    
    
     ,
    
    
     0
    
    
     ,
    
    
     0
    
    
     ,
    
    
     0
    
    
     ,
    
    
     0...
    
    
     ,
    
    
     0
    
    
     ,
    
    
     0
    
    
     ,
    
    
     0
    
    
     ]
    
   
   
     [X_{w-k-1},X_{w-k-2},...,X_3,X_2,X_1,X_0,0,0,0,0...,0,0,0] 
   
  
 [Xw−k−1​,Xw−k−2​,...,X3​,X2​,X1​,X0​,0,0,0,0...,0,0,0]

后面会有K个0.

右移

逻辑右移和算术右移

逻辑右移是低位移出,高位补0的。算数右移的高位是复制最高位的。

逻辑右移

     [
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       2
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       3
      
     
    
    
     ,
    
    
     .
    
    
     .
    
    
     .
    
    
     ,
    
    
     
      X
     
     
      3
     
    
    
     ,
    
    
     
      X
     
     
      2
     
    
    
     ,
    
    
     
      X
     
     
      1
     
    
    
     ,
    
    
     
      X
     
     
      0
     
    
    
     ]
    
   
   
     [X_{w-1},X_{w-2},X_{w-3},...,X_3,X_2,X_1,X_0] 
   
  
 [Xw−1​,Xw−2​,Xw−3​,...,X3​,X2​,X1​,X0​]

 
  
   
    
     [
    
    
     0
    
    
     ,
    
    
     0
    
    
     ,
    
    
     .
    
    
     .
    
    
     .
    
    
     ,
    
    
     0
    
    
     ,
    
    
     0
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       2
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       3
      
     
    
    
     ,
    
    
     .
    
    
     .
    
    
     .
    
    
     ,
    
    
     
      X
     
     
      k
     
    
    
     ,
    
    
     ]
    
   
   
     [0,0,...,0,0,X_{w-1},X_{w-2},X_{w-3},...,X_{k},] 
   
  
 [0,0,...,0,0,Xw−1​,Xw−2​,Xw−3​,...,Xk​,]

这里补充k个0.

算术右移

     [
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       2
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       3
      
     
    
    
     ,
    
    
     .
    
    
     .
    
    
     .
    
    
     ,
    
    
     
      X
     
     
      3
     
    
    
     ,
    
    
     
      X
     
     
      2
     
    
    
     ,
    
    
     
      X
     
     
      1
     
    
    
     ,
    
    
     
      X
     
     
      0
     
    
    
     ]
    
   
   
     [X_{w-1},X_{w-2},X_{w-3},...,X_3,X_2,X_1,X_0] 
   
  
 [Xw−1​,Xw−2​,Xw−3​,...,X3​,X2​,X1​,X0​]

 
  
   
    
     [
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     .
    
    
     .
    
    
     .
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       1
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       2
      
     
    
    
     ,
    
    
     
      X
     
     
      
       w
      
      
       −
      
      
       3
      
     
    
    
     ,
    
    
     .
    
    
     .
    
    
     .
    
    
     ,
    
    
     
      X
     
     
      k
     
    
    
     ,
    
    
     ]
    
   
   
     [X_{w-1},...,X_{w-1},X_{w-1},X_{w-1},X_{w-1},X_{w-2},X_{w-3},...,X_{k},] 
   
  
 [Xw−1​,...,Xw−1​,Xw−1​,Xw−1​,Xw−1​,Xw−2​,Xw−3​,...,Xk​,]

这里补k个X_{w-1}_.

举个例子
操作值参数x[0110 0011] [1001 0101]x<<4[0011 0000] [0101 0000]x>>4(逻辑右移)[0000 0110] [0000 1001]x>>4(算术右移)[0000 0110] [1111 1001]
在c语言里对于有符号数可以是逻辑右移,但是几乎所有编译器都是算术右移,对于无符号数必须是逻辑右移的。

标签: c语言

本文转载自: https://blog.csdn.net/zmm0628/article/details/119250443
版权归原作者 张 明明 所有, 如有侵权,请联系我们删除。

“c语言之移位运算”的评论:

还没有评论