CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第8章 その他の Java 8 機能を理解する : 問題 1 : unsigned int

問題

int と符号なし操作を使用して、{ 0 } から { 2^{32} -1 } までの間の加算、減算、除算、比較を行うプログラムを書け

解答

■ 加算
足し算自体は、普通の + で可

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

さらに問題

divideUnsignedremainderUnsignedメソッドはなぜ必要か?

解答

上記の例のように、通常の / と % 演算子で計算できないからである