怎么用逻辑右移实现算术右移?
怎么用逻辑右移实现算术右移?修改
用逻辑右移实现算术右移。
csapp第二章章末习题。
禁止使用条件,循环语句,禁止使用右移和取模运算。
int sar (int x, int k)
{
int xsrl = (unsigned)x >> k;
// 接下来怎么办?
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不是不给用右移么?怎么你代码又有。。
提示:
右移一位约等价于除以2
用递归代替循环
事实上这个题目是不允许强制类型转换/条件分支/循环的。。。
一切都只能通过位运算完成,另外使用的常数也不能超过255
就是说在写完答案后不能仅仅
make btest
+./btest funcion_name
,还应该用./dlc bits.c
检测下是否合法。特别提一下dlc
,这里作者非常用心的写了个parser检测是否合法。logicalShift
1
左移31位然后右移n-1
位从而计算出掩码,然后(x>>n)&mask
即可得出答案cl
寄存器中限定移动位数为0-31
,也就是说移动32位不是置0,而是不移动!!n
,它会在n=0
时返回0
,n!=0
返回1
,使用(!!n)&1
的返回值,我们就相当于对两种情况做了下分类n==0?n=0:n=1;
答案