• ベストアンサー

JAVAのオーバーフローを取得できませんか?

JAVAのオーバーフローを取得できませんか? while(k!=0){ k<<=1; if(キャリーフラグ的な何か){ 上記のような流れの処理を書いているのですが、こんな風に書けたらなぁ、という欲望を抱いたので質問させてもらいました。無いならないとざっくり切っていただけるとありがたい。 現状は int i=Integer.MIN_VALUE; while(k!=0){ if((k & i)!=0){ k ^= i; i >>>=1; こんな感じで見た目汚くて残念な感じです。(; ;)

質問者が選んだベストアンサー

  • ベストアンサー
  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.1

3通りほど public class Hoge { public static void main(String[] args) { int k = 12345; /* (1) kのビットパターン文字列をつくり、'0'か'1'かで判断する */ String bitPattern = String.format("%032d", 0) + Integer.toBinaryString(k); bitPattern = bitPattern.substring(bitPattern.length() - 32); System.out.println("bit pattern: " + bitPattern); /* for (int i=0; i<32; i++) if (bitPattern.charAt(i) == '1') ... 等で処理を場合分けする */ /* (2) 何度シフトすれば初めてキャリーが出るかを調べるだけなら */ int leadingZeros = Integer.numberOfLeadingZeros(k); System.out.println("numberOfLeadingZeros: " + leadingZeros); /* 単に最初のキャリーが出るのを調べるならこれで先行する0の数を調べる */ /* (3) シフトしてからキャリーが出るかどうか判断するのは面倒なので、シフトする前に最上位ビットを調べておく */ while (k != 0) { /* k != 0 で判断していると下位桁が0の場合32回回らないのでそれが嫌ならfor文等で32回強制的に回す方法も */ /* 次のシフトでキャリーフラグが立つならtrue */ //boolean setCarryBitWithNextShift = (k & 0x80000000) != 0; // マスクをかけて調査 boolean setCarryBitWithNextShift = k < 0; // 最上位ビットが立っているかどうかの判断なら負か否かでもOK k <<= 1; /* シフト後のkとsetCarryBitWithNextShiftを使って何か処理をする */ System.out.printf("%32s, carry=%b%n", Integer.toBinaryString(k), setCarryBitWithNextShift); } } }

Vitaminles
質問者

お礼

最上位ビットが立っているかどうかの判断なら負か否かでもOK Σ(゜Д゜)ハッ なぜ、こんなことに簡単なことに気がつかなかった!最近アセンブリばかり叩いていたせいでどうも計算→キャリーorゼロフラグの流れに拘りすぎていました。 でも、右シフトのときは左シフト時のようには行かないか。。。こっちは1と論理積取るしか無いかな numberOfLeadingZerosという関数は知りませんでした。 ソースをのぞいたら5回の比較だけで結果を出す高速なアルゴリズムですね。 ご回答ありがとうございましたm(_ _)m

すると、全ての回答が全文表示されます。

関連するQ&A