アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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);
}
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/21 18:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!