2016-07-25 9 views
-2

例えば、51(00110011)とビットインデックスを表すインデックスi(例えばi = 0、1、i = 2→0)がある場合、これらの例のように2の累乗を求める方法。申し訳ありませんが、私は数学の表記法では大したことではありませんが、サンプルの入力と出力を行うことができます。数値(ビットシーケンス)とビットインデックスが与えられた場合、次の最高位ビットを見つけるにはどうすればよいですか?

例:51、インデックス1(001100 1)与えられた場合、I 173、インデックス2を与えられた場合、関数は(10101 01)、また00010000 = 16

を返すようにしたいです、関数は00001000 = 8を返す必要があります。

私は、ビット演算を使用し、数値のサイズに基づいてループを使用しないソリューションを探しています。

EDIT:これは宿題ではありません。私は、ユーザーの選択を数値として格納するプログラムを作成しています。私はここに自分自身に挑戦しようとしている。ここで

は私が

x--; 
    for (int j = 0; j < 5; j++) { 
     x |= x >> (int) Math.pow(2, i); 
    } 
    x++; 
    return x; 

これは32ビットの数を取り、私にかかわらず、私は、これは任意の使用であるかどうかわからないんだけど2のべき乗を返す操作を行うことができましたなけなしのです問題。私は他の誰かが類似したものを投稿していたかどうかを見てみました。これは私が見つけたもので、私がやろうとしていることに役立つかもしれないと思いました。

EDIT 2 私は、ユーザーに曜日を選択させ、その日を1つの番号で保存しています。 1日が与えられると、私はユーザが選択した翌日を探したい。数字をブール値の配列に変換することで簡単に行うことができますが、そこに他の巧妙なソリューションがあるかどうかを見たいと思っていました。私はあまりにも "宿題"のように謝った。

私は51(00110011)とインデックス1のような数字を取ると、2^1 = 001100で割って最初の2ビットを削り取ることができます。次に、プログラムで最初の1(インデックス2)。 2ビットを削り取り、次の論理1がそれ以降のインデックス2にあったので、2 ^(2 + 2)を返します。

+1

どこの試みですか?これは宿題解決サービスではありません。 – Kon

+0

これは宿題ではありません。私は、ユーザーの選択を数字として保存したプログラムを書いています。私はここに自分自身に挑戦しようとしている。 – sadelbrid

+1

それでは、この問題を解決するためのあなたの試みを親切に投稿してください。何が間違っているか分からないことを理解するのを助けることができます。 – Kon

答えて

1

とにかくループを使用する必要があります。 Javaの場合は、右ですか?コード:

public class Test { 
    public static void main(String[] args) { 
     System.out.println(yourHomework(51,1)); 
     System.out.println(yourHomework(173,2)); 
    } 
    public static int yourHomework(int number, int index) { // LOL!! Joke! 
      for (int i = index + 1; i < 32; i++) { 
       if ((number | (1 << i)) == number) 
        return 1 << i; 
      } 
      return 0; // Or the value it must return if there is not answer 
    } 
} 

これは役に立ちますか?私はあなたのケースでそれをテストします&それは動作しますが、私はこれがあなたが必要としているかどうかは分かりません。

+0

こんにちは、ありがとうトリックでした!私はループなしでそれを行う簡単な方法があったかどうか確信していなかった...とにかく、仲間の仲間! – sadelbrid

1

ループ以外の方法もあります。

ゼロに設定したり、分離したりするなど、最も低い設定ビットで処理する簡単なやり方があります。この場合、我々はそれをゼロに設定します:それはリセットしてからの借入停止最下位セットビットになるまで1を減算すると、末尾のゼロを通じて借りますので

int x = days & (days - 1); 

これは動作します。

私達はちょうどxになりまし最下位セットビットを分離する必要がある場合には、そのための簡単なトリックがあまりにもあります:-xを書くための別の方法は、それが明らかにされ、~x + 1あるので

int mask = x & -x; 

これは動作しますそれは "高いビット"がフリップされますが、xの最下位セットビットまでの部分は同じままです(フリップされてしまいますが、+1はそれをすべて反転させます)。

ある時点で、そのビットのインデックスを取得する必要がある可能性があります。 JavaにはInteger.numberOfTrailingZerosがあります。これはJavaの実装で、1つ1つループして数え上げるよりもはるかに洗練されていますし、いくつかのプラットフォームはネイティブ命令で実装することもできます(HotSpotでは可能ですが、すべてのプラットフォームがそれを行うことができます)。

とにかく:

int pos = Integer.numberOfTrailingZeros(x); // note that we can use x here 
関連する問題