深入理解计算机系统4.1.2

divpwr2函数
这个函数要求我们求x / 2 ^n,
当x > 0,我们只需向右移动 n 位;
而当 x < 0,我们需要将x加上偏置(x + 1<<n)+~0);

为什么加偏置(bias)
在计算机中,当两个 int 类型的数 x , y作除法时,(x/y),当x不能被y整除时,表达式的结果为(x/y)的商。而这个商是通过计算机向下取整来得到的。例如当 6/5 时,结果区间在(1,2)之间,向下取整就得到 1。而当 - 6 / 5时,结果区间在(-2,-1)之间,向下取整结果为 -2,但 我们想要的结果为 -1。所以通过与偏置相加,将结果偏移到(-1,0)。再向下取整得到-1.上述可以看出除法是向0取整,而右移位是向负数取整。

#include<stdio.h>
int divpwr2(int x,int n){
	int mask=x>>31;//观察符号位
	int bias=mask&((1<<n)+~0);
	return (x+bias)>>n;
}
int main(){
	printf("%d",divpwr2(-33,4));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值