zoukankan      html  css  js  c++  java
  • 左移与右移

    左移

      无论被移动的数是有符号还是无符号,左移一位相当于乘2(在不溢出的情形下)

    右移

      对于无符号数,右移一位相当于除以2;

      对于有符号数,如果还想获得同样右移除以2的效果,就要考虑算数右移,即符号位始终不变,所有位(包括符号位)都向右移动一位,这样造成的结果就是,整数通过算数右移,最终都会等于0(所有bit都是0),负数通过算数右移,最终都会等于-1(所有bit都是1)。

    有符号算数右移与除法

    有符号算数右移与对应的除法并不等价,比如,-1 / 2结果为0,但是 -1 >> 1结果仍位-1。其中的差别从汇编码可以看出来,下面先贴出源码:

    int main() {
        int a = -1;
        int b = a / 2;
        int c = a >> 1;
    }

    对应的汇编码:

    ; 1    : int main() {
    
        push    ebp
        mov    ebp, esp
        sub    esp, 12                    ; 0000000cH
    
    ; 2    :     int a = -1;
    
        mov    DWORD PTR _a$[ebp], -1
    
    ; 3    :     int b = a / 2;
    
        mov    eax, DWORD PTR _a$[ebp]
        cdq               ;将eax的最高bit位复制到edx寄存器
        sub    eax, edx
        sar    eax, 1   ;算数右移指令
        mov    DWORD PTR _b$[ebp], eax
    
    ; 4    :     int c = a >> 1;
    
        mov    eax, DWORD PTR _a$[ebp]
        sar    eax, 1
        mov    DWORD PTR _c$[ebp], eax
    
    ; 5    : }

    从汇编码可以看到,-1 / 2和-1 >> 1的汇编码是不一样的。

  • 相关阅读:
    JS 面向对象
    堆 栈
    考试题
    HTML Meta标签
    Nodejs 安装
    CSS3 背景图片的大小位置
    JS Math函数
    CSS3 巧用before after选择器
    计算机网络原理_数据链路层
    Asp.net_验证控件
  • 原文地址:https://www.cnblogs.com/chaoguo1234/p/5414554.html
Copyright © 2011-2022 走看看