10

想不出更好的标题。那么问题是:我有“int i”,它可以是任何值。我的目标是将“int i”转换为可被16整除的最接近的数字。

例如,我得到i = 33。然后我将变成32 (16x2)。但是如果我得到i = 50,那么它将变成48 (16x3)。

我尝试了很多东西,例如:

for (int x = i; x < 999; x++){
if ( (i - x)/16 *is an integer*){
i = i - x;
}

但我不知道如何检查它是否为整数。所以也许我以前的代码可以工作,但我只需要找到一种方法来检查它是整数还是浮点数。所以..任何帮助表示赞赏。

4

7 回答 7

17

使用 mod 运算符。Mod 为您提供除法运算的剩余部分。

public boolean isEvenlyDivisable(int a, int b) {
    return a % b == 0;
}
于 2012-08-23T18:44:02.463 回答
5

(i - x)/16当余数为 0 时为整数。(i - x)/16使用 %(modulus) 运算符,如:

if((i - x)%16 == 0) {
   // (i-x)/16 is integer
}
于 2012-08-23T18:42:56.267 回答
5

由于所有可被 16 整除的整数都将其最后 4 位设置为 0。您可以在没有循环甚至 if 语句的情况下完成您想要的操作:

i &= 0xfffffff0; // Sets i to the greatest multiple of 16 less than i, or 0 for i < 16

例如:

int i = 50;
i &= 0xfffffff0; // i == 48

i = 39;
i &= 0xfffffff0; // i == 32

i = 16;
i &= 0xfffffff0; // i == 16
于 2012-08-23T20:01:00.533 回答
4

您的原始代码存在许多引人注目的问题:

  1. 如果四舍五入到最接近的 16 倍数,则可能需要减去的最高值是 15。因此,循环的上边界最多应为 15。
  2. 正如其他人所指出的,您可以使用模运算符 ( %) 来确定要从给定值中减去的确切值,以将其向下舍入到最接近的 16 倍数。这完全消除了对循环的需要。
  3. 但是由于 16 是 2 的幂,并且由于整数表示为具有 32 位(即 32 位)的二进制数,因此您可以更直接地计算该值,方法是使用位掩码将数字中小于 16 的任何数字归零。在 Java 中,您可以像这样使用二进制 & 运算符i & 0xfffffff0:这会将最后 4 位数字清零(代表:8-4-2-1),这有效地将您的数字向下舍入到可被 16 整除的最接近的值。
  4. 如果您需要对数字进行整数除法并忽略任何余数,您只需将 ( >>) 移动 4 位即可。
于 2012-08-23T18:53:59.580 回答
1

要确定一个数字是否将另一个数字整除,请查看其他答案,Modulo (%) 是这样做的方法。

要执行上述操作,您不需要循环:

public int nearestDivider(final int input)
{
    final int multiple = input / 16; // this will divide by 16 and it's integer math, so it loses the decimal
    return multiple * 16;
}

如果你像你的例子一样给它 50,那将返回 48。

如果你真的想要最近,那么你将不得不做一些浮点除法

public int nearestDivider(final int input)
{
    final int multiple = Math.round((float) input / 16);
    return multiple * 16;
}

现在 46 返回 48, 149 返回 144 等等。

于 2012-08-23T18:53:25.430 回答
1

为了检查随机除法是否导致整数或分数,您需要以下内容:

int n = 9;
int p = 3;

if (n % p == 0) {
    //the division results in an integer.
}
else
{
    //the division results in a fraction.
}

您可以这样做:

if (n / p == Math.ceil((double) n / (double) p)) {
    //the division results in an integer.
}
else
{
    //the division results in a fraction.
}

需要 Math.ceil() 而不是四舍五入或下限,因为整数除法几乎等于下限,而分数将向下取整并显示为“整数除法”。

于 2017-02-06T15:57:58.927 回答
0

如果您需要最接近的 16 的倍数,那么您有两种情况来处理 8 的奇数倍数。1. 8 变为 16,24 变为 32 2. 8 变为 0,24 变为 16

为了第一:

int j = ((i+8)/16)*16;

在第二种情况下:

int j = ((i+7)/16)*16;

如果你想一直向下取整(即 17 变为 16,15 变为 0):

int j = (i/16)*16;

如果你想总是向上取整(不是你的例子所说的),你会这样做:

int j = ((i+15)/16)*16;
于 2012-08-23T19:54:50.947 回答