想不出更好的头衔。 那么问题是: 我有“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;
}
但我不知道如何检查它是否为整数。所以也许我以前的代码工作,但我只需要找到一种方法来检查它是一个整数还是一个浮点数。所以..任何帮助表示赞赏。
答案 0 :(得分:13)
使用mod运算符。 Mod为您提供除法运算的剩余部分。
public boolean isEvenlyDivisable(int a, int b) {
return a % b == 0;
}
答案 1 :(得分:5)
(i - x)/16
的余数为0时, (i - x)/16
为整数。使用%(模数)运算符,如:
if((i - x)%16 == 0) {
// (i-x)/16 is integer
}
答案 2 :(得分: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
答案 3 :(得分:4)
您的原始代码存在许多引人注目的问题:
%
)来确定从给定值减去的精确值,以将其向下舍入到最接近的16的倍数。这样就完全不需要循环i & 0xfffffff0
。这将使最后4位数字(代表:8-4-2-1)数字归零,这有效地将您的数字向下舍入到可被16整除的最近值。>>
)移位4位来代替。答案 4 :(得分: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等。
答案 5 :(得分: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;
如果你想要总是想要倒DOWN(即17变为16,而15变为0):
int j = (i/16)*16;
如果你想要总是向上舍入(不是你的例子所说的那样),你可能会这样做:
int j = ((i+15)/16)*16;
答案 6 :(得分:0)
为了检查随机分割是否产生整数或分数,您需要以下内容:
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()而不是round或floor,因为整数除法几乎等于一个floor并且fraction会向下舍入并显示为&#39;整数除法&#39;。