逻辑右移函数 srl()与算术右移函数 sra() (转)

 

比如一个有符号位的8位二进制数11001101,逻辑右移就不管符号位,如果移一位就变成01100110。算术右移要管符号位,右移一位变成10100110。

逻辑左移=算数左移,右边统一添0

逻辑右移,左边统一添0

算数右移,左边添加的数和符号有关

附上代码:

int sra(int x, int k)
{
    int xsrl = (unsigned) x >> k;
    int w = sizeof(int) << 3;
    return xsrl |= (-1 << (w-k));
} 
unsigned srl(unsigned x, int k)
{
    unsigned xsra = (int) x >> k;
    int w = sizeof(int) << 3;
    return xsra &= ~(-1 << (w - k));
}

e.g:1010101010,其中[]位是添加的数字

逻辑左移一位:010101010[0]

算数左移一位:010101010[0]

逻辑右移一位:[0]101010101

算数右移一位:[1]101010101

rebooting...
原文地址:https://www.cnblogs.com/hutiann/p/5732275.html