码迷,mamicode.com
首页 > 其他好文 > 详细

2.63 还原算数右移,逻辑右移

时间:2020-05-10 23:01:10      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:exp   app   logic   原来   ret   logical   ==   int   负数   

//csapp 2.63, 还原算数右移,逻辑右移

#include <stdio.h>

unsigned srl(unsigned x, int k)
{   
    /* Perform shift arithmetically */
    unsigned xsra = (int) x >> k;
    //begin this
    //此处由于转换成int,原来的逻辑右移变成了算数右移,通过以下代码还原为逻辑右移
    //逻辑右移,高位补0,产生w-k 位之前的数据位为0,之后的位为1
    unsigned w = sizeof(unsigned)<<3;
    int mask = (1 << (w-k)) -1; 
    return xsra & mask;
}   

int sra(int x, int k)
{   
    /* Perform shift logically */
    int xsrl = (unsigned) x >> k;
    //begin this
    //此处由于转换为无符号数,右移变为逻辑右移,通过以下代码还原为算数右移
    unsigned w = sizeof(unsigned)<<3;
    //最高有效位数据位,如果数据不为0,则代表应该进行算数右移,
    //w-k-1, w-k会比原来数据高出一位
    int bit_data = (1 << (w-k-1)) & xsrl;
    //1. bit_date==0,次数为正数,不需要处理, 此时-1取反的数据还是0,
    //2. bit_date不为0,次数为负数,高位填充1,此时-1使高位还为0,低位全为1,取反后高位全为1
    int mask = ~(bit_data-1);

    return xsrl | mask;
}   

int main(void)
{   
    unsigned w = sizeof(unsigned)<<3;
    printf("srl((signed)-1,w-1), expect:1, result:%d\r\n", srl((unsigned)-1, w-1));
    printf("sra(-1,1), expect:-1, result:%d\r\n", sra(-1, 1));
    printf("((unsigned)-1) >> w-1, result:%d\r\n", ((unsigned)-1) >> (w-1));                                                                                                       
    printf("-1>>1 : result : %d\r\n", -1>>1);
    return 1;
}

2.63 还原算数右移,逻辑右移

标签:exp   app   logic   原来   ret   logical   ==   int   负数   

原文地址:https://www.cnblogs.com/LonelyTraveler/p/12865620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!