CSAPP第二章2.63题解

#include<stdio.h>
unsigned srl(unsigned x,int k){
    //不让右移就左移,通过左移可以达到右移的效果,形成等长前为0,后为1的效果
    unsigned xsra=(int)x>>k;
    int w=sizeof(int)<<3;
    int ki=k+((!k)<<(((sizeof(int)>>2==1)<<2)+(sizeof(int)>>2==1)));//考虑为零的情况,此时,当k==0时改变ki等于int位数w,不为零时不变
    int shitfs=(int)((k==0)-1)<<(w-ki);                             //为零时使用0来构造偏移,不为零时使用-1构造偏移,达到消除零的影响
    return (unsigned)(xsra&~shitfs);
}
int sra(int x,int k){
    //思路---要取到两个东西:一是原符号位,二是形成与原右移等长的01列;
    //拿到等长的01列
    int xsrl = (unsigned) x>>k;
    int w = sizeof(int)<<3;
    int ki=ki=k+((!k)<<(((sizeof(int)>>2==1)<<2)+(sizeof(int)>>2==1))); //考虑为零
    int mask = (int)((k==0)-1)<<(w-ki);                                 //构造等长偏移
    //拿到符号位
    int mmask = (int)-1<<(w-1);//截符号位
    mask = mask&(!(mmask&x)-1);//(mmask&x)如果符号位为1形成1000..00,如果符号位为0,形成0000..00,通过!(mmask&x)-1如果为0,形成全0,如果1,形成全1.最后&形成等偏移长10或者00列
    return xsrl|mask;
}
int main(){
    unsigned a = 0x12345678;
    int b = 0x12345678;
    printf("%x\n",srl(a,31));
    printf("%x\n",sra(b,31));
}

posted @ 2022-08-04 15:45  Abruptrainlover  阅读(153)  评论(0)    收藏  举报