CSAPP一道移位运算题

**2.81 编写C表达式产生如下位模式,其中a(k)表示符号a重复k次。假设一个w位的数据类型。
代码可以包含对参数j和k的引用,它们分别表示j和k的值,**但是不能使用表示w的参数**。

A. 1(w-k)0(k)
B. 0(w-k-j)1(k)0(j)

这是CSAPP上面的一道课后习题,这里只考虑A题支,我看了很多答案,他们是这样写的:

int A(int k)
{
    return -1 << k; 
}

//or

int A(int k)
{
    return ~((1<<k) - 1);
}

这些解答在0 <= k < w的时候是正确的,但是当k = w时,参考下面移位运算的说明,有A(w) = -1

clipboard.png

1(w-k)0(k) = 0(w) = 0,二者并不相等。在不使用w变量的条件下真的可以得到正确的结果吗?

补充题目要求:

clipboard.png

阅读 2.2k
1 个回答

分成两次移动,不过要多加一个判断。

if (k < 2) return -1 << k;

return (-1 << (k - 1)) << 1;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进