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);
}
}
}
最上位ビットが立っているかどうかの判断なら負か否かでもOK Σ(゜Д゜)ハッ
なぜ、こんなことに簡単なことに気がつかなかった!最近アセンブリばかり叩いていたせいでどうも計算→キャリーorゼロフラグの流れに拘りすぎていました。
でも、右シフトのときは左シフト時のようには行かないか。。。こっちは1と論理積取るしか無いかな
numberOfLeadingZerosという関数は知りませんでした。
ソースをのぞいたら5回の比較だけで結果を出す高速なアルゴリズムですね。
ご回答ありがとうございましたm(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- Java すみません。助けてください。 javaについての質問です。 integerに変換できない数値をエラー 5 2022/05/18 19:16
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
Java、2の0乗~10乗の表示
-
総称型ArrayList<E>への参照...
-
java キーボード入力された値の...
-
コマンドライン引数の例外処理...
-
繰り返しによる星印の出力
-
キーボードから10人分の点数を...
-
javaプログラムについて
-
countに実行した回数をいれたい...
-
swing java
-
要素数が10の配列で、乱数0~9...
-
論理演算子”||”またはの入力方法
-
Java 入力した整数値の合計を、...
-
階乗の式
-
テキストボックスに入力された...
-
java 電卓のプログラム
-
Javaのはじめての質問です。 こ...
-
3つの値の中間値を求める
-
Javaでキーボードから入力され...
-
Javaのforとwhileの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
Randomメソッドの確率設定
-
論理演算子”||”またはの入力方法
-
テキストボックスに入力された...
-
java キーボード入力された値の...
-
countに実行した回数をいれたい...
-
Java 配列<選挙>
-
総称型ArrayList<E>への参照...
-
Java、2の0乗~10乗の表示
-
2つのスクロールバーを連動させ...
-
数値⇒漢数字変換 java
-
Java 入力した整数値の合計を、...
-
配列を逆順させて表示させる方...
-
エラー(互換性の無い型)
-
javaで数独を解くプログラムに...
-
2次元配列の並び替え
-
javaのエラーが回収できない
-
7つ数字を表示したら改行すると...
-
java 電卓のプログラム
おすすめ情報