unsignedsrl(unsigned x, int k) { //Perform shift arithmetically unsigned xsra = (int)x >> k; //将算术右移补符号位替换成0,完成逻辑右移 xsra &= ((unsigned)-1 >> k); return xsra; } intsra(int x, int k) { //Perform shift logically int xsrl = (unsigned)x >> k; //将逻辑右移的补高位0替换成算术右移的符号位 int w = sizeof(int) << 3; //获取位长w int z = 1 << (w - k - 1); // int mark = z - 1; // int right = xsrl & mark; int left = ~mark & (~(z&xsrl)+z); //不理解。