在C语言中,左移为逻辑移位,即左移右侧补0;右移为算术移位,即右移左侧补符号位。
本质上就是先把(int)x右移k位,然后将0xffffffff左移sizeof(int)*8-k位后取反,得到的就是串 00000…1111111111,其中有k个0,然后做与运算。即将高位符号位1变为0,低位保持不变。
//算术右移完成逻辑右移unsigned srl(unsigned x,int k){ /*Perform shift arithmetically*/ unsigned xsra = (int)x >> k; unsigned wei = 8*sizeof(int); unsigned left = -1 << (wei-k); //0xffffffff左移wei-k位,取反得到000...1111与xsra相与 return xsra&(~left);} 3. 利用逻辑右移实现算术右移 //逻辑右移完成算术右移int sra(int x,int k){ /*Perform shift logically*/ int xsrl = (unsigned) x>>k; int wei = 8*sizeof(int); //0x00000001左移wei-k-1位,和原数符号位对齐,做与运算 int left = 1 << (wei-k-1); if(left&xsrl){//为真,说明符号位为1 return (-1<<(wei-k))|xsrl; //补上符号位的1 } //符号位为0,直接返回 return xsrl;}