C 如何使用位运算将1添加到无符号整数中的浮点数?
我正在尝试使用位操作实现我自己的楼层功能。我让它为正数工作,所以我得到C 如何使用位运算将1添加到无符号整数中的浮点数?,c,C,我正在尝试使用位操作实现我自己的楼层功能。我让它为正数工作,所以我得到 roundDown(5.4) = 5. 我想把负数也四舍五入。例如,我想要 roundDown(-5.4)= -6 我的策略是取负数,清除有符号位使其为正数,加1,像我对正数所做的那样进行四舍五入,然后将有符号位设置回1,使数字再次为负数 我的问题是,我不知道如何将1添加到无符号整数中。我想使用逐位运算来实现这一点,我已经做了几个小时了,非常想弄明白这一点 因为roundDown()用于正数,所以将其用于负数 dou
roundDown(5.4) = 5.
我想把负数也四舍五入。例如,我想要
roundDown(-5.4)= -6
我的策略是取负数,清除有符号位使其为正数,加1,像我对正数所做的那样进行四舍五入,然后将有符号位设置回1,使数字再次为负数
我的问题是,我不知道如何将1添加到无符号整数中。我想使用逐位运算来实现这一点,我已经做了几个小时了,非常想弄明白这一点 因为roundDown()用于正数,所以将其用于负数
double roundDownAll(double x) {
if (x >= 0.0) {
return roundDown(x);
}
else {
double y;
y = -roundDown(-x);
// If no rounding occurred (e.g. -5 == -roundDown(- -5);
if (x == y) {
// We are done.
return y;
}
else {
// rounding occurred in the wrong direction, so compensate.
return y-1;
}
}
}
这是通过位操作实现的增量。无符号int比int好
int bitincr(int a)
{
int b = 1;
do
{
int c = a & b;
a = a ^ b;
b = c << 1;
}
while (b != 0);
return a;
}
int-bitincr(int-a)
{
int b=1;
做
{
INTC=a&b;
a=a^b;
b=c这显示了如何通过仅对表示进行位运算将正浮点数四舍五入到最接近的整数。正数和负数的向下舍入都涉及类似的运算(当正浮点数四舍五入到最接近的整数时,有时需要向上舍入)。关键步骤是提取指数:
int exp = ((u>>23) & 255) - 127;
计算与输入对齐的浮点数1.0
表示中应设置的位:
if (23 - exp < 0) return f;
unsigned int one = 1U << (23 - exp);
可能,但这会很痛苦-在尾数上做任何事情之前,你需要检查指数部分。正常地做这件事。嗯,为什么不干脆int取整(float x){return x>0?(int)x:(-x+1);}
?我需要在不使用强制转换的情况下执行此操作,应该只使用位运算。不过,谢谢!最后一个可能是(int)(x-1)?@user2057841:您是否在没有浮点单元的环境中工作?浮点的格式是什么?IEEE单精度/双精度?还是您自己的格式?
unsigned int mask = one - 1;
unsigned int frac = u & mask;
...