如何将数字舍入到最接近的64的倍数

4
我正在尝试创建一个程序,在瓷砖地图上创建一个正方形。每个瓷砖大小为64x64。我认为需要获取鼠标的坐标,将其四舍五入到最近的64的倍数,并将其除以64以获取瓷砖坐标。是否有更好的方法?我应该将所有瓷砖都制作成按钮吗?谢谢!
2个回答

8
您可以按照以下步骤进行操作:
int number = 445226;
int roundoff = (number+0x20)&(~0x3f);

它的工作方式如下:
  1. 首先将数字加上 32 (0x20) ,使其向上/向下四舍五入。这意味着小于 32 的所有内容将导致小于 64 的值,而大于 32 的所有内容都将导致大于 64 的值。
  2. 掩码掉最后六位。
一般来说,按位运算比除法和乘法更快。而且,由于您要求的是2的幂次方,所以这是一个很好的性能技巧。
但如果您对瓦片坐标感兴趣,我想您不必再将其乘以 64。在这种情况下,您可以使用以下代码:
int number = 445226;
int div64 = (number+0x20)>>0x06; //this is divided by 64, not rounded

关于用户界面,通常有多种正确答案,但如果你要在上面绘制某种地图,我想坐标比按钮更好。特别是如果在后续过程中,人们将能够点击位于两个按钮之间的地图上的项目。

2

对于正整数:

int m64 = 64 * ((n + 32) / 64);

或者更加花哨,因为64恰好是2的幂:

int m64 = ((n + 32) >> 6) << 6;

在这里,您需要将其除以64并四舍五入。而且,通过移位可以更有效地进行“64”的除法运算... - Willem Van Onsem
他为什么需要四舍五入呢?整数运算不是会自动四舍五入到最近的单位吗? - EDToaster
@JClassic 不是的。整数运算截断,就像调用floor()一样,例如9/10 -> 0,这不是四舍五入到最接近的整数,而是向下取整到除法结果的下一个整数。 - Bohemian
1
@CommuSoft:首先,在执行将除数取整后进行64的整数分割之前,将被除数加32可以产生四舍五入除法。其次,不,移位不能更有效地完成。当除数是已知常数时,效率没有区别。 - AnT stands with Russia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接