看了官方的解答,没有对k=0的处理,这边附上自己的解答,有对0的处理
这边当k=0时,会左移超过w-1,这边是不正确的,附上自己的解答,用了一个&运算避免
unsigned srl(unsigned x, int k) {
unsigned xsra = (int) x >> k;
int mask = (!k - 1) << ((!k - 1) & (8 * sizeof(int) - k));
return xsra & (~mask);
}
int sra(int x, int k) {
int xsrl = (unsigned) x >> k;
int flag = !(x & (1 << (8 * sizeof(int) - 1)));
int mask = (!k - 1) << ((!k - 1) & (8 * sizeof(int) - k));
flag = flag - 1;
return xsrl | (mask & flag);
}