首页
社区
课程
招聘
[求助]怎么用C语言实现左右逻辑移位
发表于: 2009-2-22 10:41 6820

[求助]怎么用C语言实现左右逻辑移位

2009-2-22 10:41
6820
请高手帮忙一下给个答案或例子!
谢谢

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
什么是“左右逻辑”???

如果你指的是逻辑移位的话,C中的移位操作符 << 和 >> 就是执行逻辑移位的。

比如,unsigned bit_mask = ( 0x01 << 15 );

bit_mask的值是 0x8000。
2009-2-22 11:02
0
雪    币: 257
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢!书呆彭
那么右移位,编译结果同不同?
2009-2-22 11:11
0
雪    币: 257
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
逻辑移位:(unsigned)>>   和   (unsigned)<<  
  算术移位:(signed)>>   和   (signed)<<  
   
  int   main(void)  
  {  
      int   x   =   0xabcd;  
      unsigned   int   y   =   0xdcba;  
   
      x<<=2;   //与   (signed   int)x<<=2;   相同,因为变量本身是signed  
      (unsigned   int)x<<=2;  
      x>>=2;  
      (unsigned   int)x>>=2;  
   
      (signed   int)y<<=2;  
      y<<=2;  
      (signed   int)y>>=2;  
      y>>=2;  
   
      return   x+y;  
  }  

汇编结果:  
   
  _TEXT segment   byte   public   'CODE'  
  assume cs:_TEXT,ds:DGROUP  
  _main proc near  
  ?debug C   E80105312E63707012AD422B  
        ;  
        ; int   main(void)  
        ;  
  push bp  
  mov bp,sp  
        ;  
        ; {  
        ;     int   x   =   0xabcd;  
        ;  
  mov dx,-21555  
        ;  
        ;     unsigned   int   y   =   0xdcba;  
        ;  
  mov bx,-9030  
        ;  
        ;  
        ;     x<<=2;  
        ;  
  shl dx,2  
        ;  
        ;     (unsigned   int)x<<=2;  
        ;  
  shl dx,2  
        ;  
        ;     x>>=2;  
        ;  
  sar dx,2  
        ;  
        ;     (unsigned   int)x>>=2;  
        ;  
  shr dx,2  
        ;  
        ;  
        ;     (signed)y<<=2;  
        ;  
  shl bx,2  
        ;  
        ;     y<<=2;  
        ;  
  shl bx,2  
        ;  
        ;     (signed)y>>=2;  
        ;  
  sar bx,2  
        ;  
        ;     y>>=2;  
        ;  
  shr bx,2  
        ;  
        ;  
        ;     return   x+y;  
        ;  
  mov ax,dx  
  add ax,bx  
        ;  
        ; }  
        ;  
  pop bp  
  ret  
  _main endp  
  ?debug C   E9  
  ?debug C   FA00000000  
  _TEXT ends  
   
  因为算术左移和逻辑左移的结果一样,所以都编译成逻辑的,而右移不同,编译结果也不同
2009-2-22 11:11
0
游客
登录 | 注册 方可回帖
返回