10

これ以上のタイトルが思い浮かびませんでした。問題は次のとおりです。「int i」があります。これは任意の値にすることができます。私の目標は、「int i」を16で割り切れる最も近い数に変換することです。

たとえば、私はi = 33を得ました。次に、 i は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

16 で割り切れるすべての int は、最後の 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 に答える
5

(i - x)/16の剰余が 0 の場合は整数です。次の(i - x)/16ような %(モジュラス) 演算子を使用します。

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

元のコードには、いくつかの顕著な問題があります。

  1. 最も近い 16 の倍数に切り下げる場合、減算する必要がある可能性のある最大値は 15 になります。したがって、ループの上限は最大で 15 にする必要があります。
  2. 他の人が指摘したように、モジュロ演算子 ( %) を使用して、特定の値から減算する正確な値を決定し、最も近い 16 の倍数に切り捨てます。これにより、ループが完全に不要になります。
  3. ただし、16 は 2 のべき乗であり、整数は 32 桁 (つまり 32 ビット) の 2 進数として表されるため、ビットマスクを使用して数値の 16 より小さい桁をゼロにすることで、より直接的に値を計算できます。Java では、バイナリ & 演算子を次のように使用できますi & 0xfffffff0。これにより、最後の 4 桁 (8-4-2-1 を表すもの) がゼロになり、数値が 16 で割り切れる最も近い値に効果的に切り捨てられます。
  4. 数値の整数除算を実行し、剰余を無視する必要がある場合>>は、代わりに ( ) を 4 ビットだけシフトするだけで済みます。
于 2012-08-23T18:53:59.580 に答える
1

数値が別の数値を均等に分割するかどうかを調べるには、他の回答を確認してください。モジュロ (%) はそれを行う方法です。

上記でやりたいことを行うには、ループは必要ありません。

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 の奇数倍数を処理する 2 つのケースがあります。1. 8 は 16 になり、24 は 32 になります 2. 8 は 0 になり、24 は 16 になります

最初の場合:

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

2 番目のケースでは:

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 に答える