【发布时间】:2019-05-02 21:37:16
【问题描述】:
我正在尝试将一个整数四舍五入到一个数字的最接近的倍数。
假设数字等于80。
有没有比x -= (x % the_number) 更有效的方法?
这是一个例子:
#include <stdio.h>
int main(void)
{
int x = 191;
int the_number = 80;
printf("x == %d\n", x);
x -= (x % the_number);
printf("x - (x %% the_number) == %d\n", x);
return 0;
}
这是另一个例子。它不像以前那样是一个完整的工作程序,但我想要做的事情更清楚:
#define LIGHT_GRAY 0x0700
#define COLUMNS 80
void pm_putchar(int c, void **ptr)
{
c &= 0xff;
c |= LIGHT_GRAY;
if(c == '\n' | LIGHT_GRAY)
*ptr += COLUMNS;
else if(c == '\r' | LIGHT_GRAY)
*ptr -= (*ptr % COLUMNS);
**(short **)ptr = (short)c;
(*ptr) += 2;
}
在上述示例中,假设 *ptr 等于或高于 VGA 文本缓冲区 (0x0b8000) 的位置。
【问题讨论】:
-
“有没有比 x -= (x % the_number) 更有效的方法?”鉴于该操作是 O(1),您希望获得多高的效率?
-
x = (x / the_number) * the_number; -
你怎么知道它不是“高效”的?仅仅因为似乎有很多操作正在进行,并不意味着它效率低下。您是否查看过生成的机器代码或对其进行基准测试/配置文件/计时(启用优化)?
-
我知道
div指令会占用大量CPU时间。 -
@JL2210 你想如何处理负数?