第8章 その他の Java 8 機能を理解する : 問題 1 : unsigned int
問題
int と符号なし操作を使用して、 から までの間の加算、減算、除算、比較を行うプログラムを書け
解答
■ 加算
足し算自体は、普通の + で可
int a = Integer.MAX_VALUE; // 2^31 - 1 int b = Integer.MAX_VALUE + 1; // 2^31 System.out.println(Integer.toUnsignedString(a + b)); // 4294967295
■ 減算
引き算自体も、普通の - で可
int a = Integer.MAX_VALUE + 2; // 2^31 + 1 int b = 1; System.out.println(Integer.toUnsignedString(a - b)); // 2147483648
■ 除算
割り算は、専用のメソッドdivideUnsigned
を使う必要がある
◆ 符号ありのケース
int a = Integer.MAX_VALUE + Integer.MAX_VALUE + 1; int b = 4; System.out.println("商 : " + (a / b) + " 余り : " + (a % b)); // 0, -1
◆ 符号なしのケース
int a = Integer.MAX_VALUE + Integer.MAX_VALUE + 1; int b = 4; int divide = Integer.divideUnsigned(a, b); // 1073741823 int remainder = Integer.remainderUnsigned(a, b); // 3 System.out.println("商 : " + divide + " 余り : " + remainder);
■ 比較
専用のメソッドcompareUnsigned
を使う必要がある
int a = 1; int b = -1; // 2^32 - 1 System.out.println(Integer.compareUnsigned(a, b)); // a < b
さらに問題
divideUnsigned
とremainderUnsigned
メソッドはなぜ必要か?
解答
上記の例のように、通常の / と % 演算子で計算できないからである