このメソッドは、絶対値を取得しようとしている n ビットの 2 の補数と、その数値が得られるビット数を受け取ります。ここではいくつかの例を示します。
腹筋 (0x00001234, 16); // => 0x00001234
abs(0x00001234, 13); // => 0x00000DCC
したがって、最初の例では、0x00001234 が 0x00001234 であることがわかります。これは、16 ビットでは、それ自体であるのに十分な先行ゼロがあるためです。
ただし、2 番目の例では、13 ビットを使用すると 0x00001234 の符号ビットが 1 になるため、この 13 ビットの数値を正の数値に変換すると、0x00000DCC が得られます。
これまでのところうまくいくはずですが、場合によってはうまくいきません:/何が間違っているのか、どの方向に進むべきなのか、何か考えはありますか?
編集: また、言及するのを忘れていましたが、1 だけインクリメントしない限り、>>> や +、-、*、/ は使用できません。
public static int abs(int num, int n)
{
boolean set = ((1 << n-1) & num) == (1 << n-1);
if (!set) {
return num;
} else {
int bitmask = (0x7FFFFFFF >> (32-n)) | (1 << n-1);
return (num ^ bitmask) + 1;
}
}