Ich könnte mir keinen besseren Titel vorstellen. Nun, das Problem ist: Ich habe das "int i", es kann einen beliebigen Wert haben. Mein Ziel ist es, das "int i" in die nächste durch 16 teilbare Zahl zu transformieren.
Zum Beispiel habe ich i = 33 . Dann werde ich zu 32 (16x2) gedreht. Aber wenn ich i = 50 bekomme, wird es zu 48 (16x3) .
Ich habe viele Dinge zum Beispiel ausprobiert:
%Vor%Aber ich weiß nicht, wie man überprüft, ob es eine ganze Zahl ist. Vielleicht funktioniert mein vorheriger Code, aber ich muss nur einen Weg finden, um zu überprüfen, ob es eine Ganzzahl oder ein Gleitkomma ist. Also ... jede Hilfe wird geschätzt.
Benutze den Mod-Operator. Mod gibt Ihnen den Rest einer Divisionsoperation.
%Vor% (i - x)/16
ist eine Ganzzahl, wenn der Rest von (i - x)/16
0 ist. Verwenden Sie% (Modulus) wie:
Es gibt einige auffällige Probleme mit Ihrem ursprünglichen Code:
%
) verwenden, um den genauen Wert zu bestimmen, der von einem gegebenen Wert abgezogen wird, um ihn auf das nächste Vielfache von 16 abzurunden / li>
i & 0xfffffff0
. Dadurch werden die letzten 4 Ziffern (die für 8-4-2-1 stehen) auf Null gesetzt, wodurch Ihre Zahl effektiv auf den nächsten durch 16 teilbaren Wert abgerundet wird. >>
) um 4 Bits verschieben, um dies stattdessen zu tun. Um herauszufinden, ob eine Zahl eine andere gleichmäßig verteilt, sehen Sie sich die anderen Antworten an. Modulo (%) ist die Methode dafür.
Um das zu tun, was Sie tun wollen, brauchen Sie keine Schleife:
%Vor%Das wird 48 zurückgeben, wenn Sie es 50 wie Ihr Beispiel geben.
Wenn Sie nearest wirklich wollen, müssen Sie eine Gleitkomma-Division machen
%Vor%Nun gibt 46 zurück 48, 149 gibt 144 usw. zurück.
Wenn Sie das nächste Vielfache von 16 benötigen, dann haben Sie zwei Fälle, um mit ungeraden Vielfachen von 8 umzugehen. 1. 8 wird 16, 24 wird 32 2. 8 wird 0, 24 wird 16
Für den ersten:
%Vor%Im zweiten Fall:
%Vor%Wenn Sie immer abrunden wollen (d. h. 17 wird 16 und 15 wird 0):
%Vor%Wenn Sie immer aufrunden wollten (nicht das, was Ihr Beispiel sagt), hätten Sie das stattdessen getan:
%Vor%Um zu überprüfen, ob eine zufällige Division zu einer Ganzzahl oder einem Bruch führt, benötigen Sie Folgendes:
%Vor%Sie können dies als Alternative tun:
%Vor%Man benötigt Math.ceil () und nicht round oder floor, weil eine ganzzahlige Division fast gleich einem floor ist und der Bruch abgerundet wird und als 'integer division' erscheint.