こんにちは私は、より広いデータ型(例えば、long、doubleなど)にキャストせずにこのメソッドを実装する方法があるのでしょうか?* bが整数の可能な値に収まるかどうかを判断するアルゴリズムはありますか? (より広い型にキャストしないで)
CanTimes(int a, int b){
returns true if a * b is within the range of -2^31 to 2^31-1, else false;
}
たとえば、我々は次のような(キャストのない)方法CanAdd
のための1つを実現することができます。もちろん、これは言語に依存しない問題の詳細ですけれども
public static boolean CanPlus(int a, int b) {
if (b >= 0) {
return a <= Integer.MAX_VALUE - b
} else {
return a >= Integer.MIN_VALUE - b
}
}
実装言語は、Javaのです。
私は、* bがより広いデータ型にキャストせずに整数の範囲に適合するかどうかを判断するために採用できるロジックがあると思っていましたか?
解決策! Strelokさんのコメントに基づいて:
public static boolean CanTimes(int a, int b) {
if (a == 0 || b == 0) {
return true;
}
if (a > 0) {
if (b > 0) {
return a <= Integer.MAX_VALUE/b;
} else {
return a <= Integer.MIN_VALUE/b;
}
} else {
if (b > 0) {
return b <= Integer.MIN_VALUE/a;
} else {
return a <= -Integer.MAX_VALUE/b;
}
}
}
なぜですか?なぜ人工的な制限? – EJP
あなたは 'Integer.numberOfLeadingZeros'で何かできることがあります。両方の先行ゼロの合計が31より大きい場合、それは依然としてintなどです。 – Thilo
@EJP人為的な制限ではありません。もっと広いデータ型にキャストしなくてもそれを行う方法があるのだろうかと思います。たとえば、HeadGeekにはここで半分の解決策がありますhttp://stackoverflow.com/a/199455/632951。私はそれが実際に働くように改善する方法に興味を持っていましたが、彼は見積もりです。 – Pacerier