2016-09-25 5 views
1

私はこの問題を抱えています。ご協力いただきありがとうございます。異なる右端のビットを見つける

あなたには2つの整数nとmが与えられています。それらがバイナリ表現で異なる右端のビットの位置を見つけます(そのようなビットが存在することが保証されています)。右から左に数えます。

2position_of_the_found_bit(0ベース)の値を返します。

についてはn = 11およびm = 13、出力があるべき differentRightmostBit(N、M)= 2

11(添字10)= 1011(添字2)、13(下付き文字)10 = 1101(下付き文字2)、それらが異なる右端のビットは、バイナリ表現の右から1位のビット(0ベース)です。 答えは1の2乗= 2です。

+0

あなたは何をしましたか? –

+0

私はビット演算子を学び始めました。あなたが私に正しい方向を向けるヒントを与えることができるかどうか疑問に思っていました。ありがとう。 – brewersfan1976

+0

片方向:XORを実行すると、すべての共通ビットがゼロに設定され、一致しなかったビットが設定されます。さて、右から始めて、最初の非ゼロビットのビット位置を見つけてください。すなわち右シフトまたはビット位置をチェックするだけである。 –

答えて

0

すべての整数は32ビットレジスタに格納されているため、32番目のレジスタでは右から1が必要なので、32個のレジスタすべてで値をチェックする必要があります。 -32 = 1であり、最後に答えは33-a [k-1]である。ここで私はちょうどバイナリ値が配列 'a'で等しくない位置を格納し、配列の最後の要素を出力すると-ve整数でも機能します。

#include <iostream> 
    using namespace std; 
    int main() 
    { 
     int n,m,k=0,y=0; 
     cin>>n>>m; 
     int a[32]; 
     for(int i=31;i>=0;i--) 
     { 
      y=y+1; 
      if(n & (1<<i)) 
      {if(!(m & (1<<i))) 
       { 
        a[k]=y; 
        k++; 
       } 
      }else 
      if (!(n & (1<<i))) 
      {if (m & (1<<i)) 
       { 
        a[k]=y; 
        k++; 
       } 
      } 
     } 
     cout<<33-a[k-1]; 
     return 0; 
    } 
+0

あなたの助けにRahulに感謝します。あなたが私の巧妙な解決策を見ることができる1つのライナーであることが必要であったことを忘れてしまった。 – brewersfan1976

+0

あなたの方法を確認しましたが、2番目のインデックスまたは3番目のインデックスを右から印刷する必要がある場合は、値が異なる場合は何回も数式を変更する必要がありますが、ここでインデックスを2番目または3番目の最後の要素配列「a」の「k-2またはk-3」。 @ brewersfan1976 –

7

ビット演算子で遊んだ後、私はそれを得ました!答えは(n^m)& - (n^m)

私はビット演算子をバイナリ文字列に変換して最初の不一致を見つけることで、ビット演算子を使わずに簡単にルビでこれを行うことができました(2 **の位置)に戻ってきましたが、トリッキーな部分であるビットごとの演算子を使用して1つのライナーにする必要がありました。

私は正しい方向に私を指差してRyanに信用を与えます。ありがとうライアン!!

+0

バイナリ操作の学習も...バイナリと負の正の数はどうなりますか? –

+0

これは正解です – Viet

0

あなたの質問の答えは次の形式で、このコードのjava.The入力で書かれた以下のコードです:

入力:入力の 最初の行はの数を示し、単一の整数Tが含まれていますテストケース。 Tテストケースが続きます。各テストケースの最初の行には、M 2のスペースで区切られた整数が含まれており、N.

例:バイナリ「11」で

Input: 
2 
11 9 
52 4 
Output: 
2 
5 

は「1011」 と「9」は「1001」であり、あなたのように2番目のビット(RHSから)が異なっており、それが私たちの答えになるはずです。

import java.io.IOException; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.util.StringTokenizer; 
//sourabh agrawal 
class GFG { 
    public static void main(String[] args)throws IOException{ 
     final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     int t = Integer.parseInt(br.readLine().trim()); 
     StringBuilder sb = new StringBuilder(); 

     while(t-->0){ 
      StringTokenizer st = new StringTokenizer(br.readLine().trim()); 

      int a = Integer.parseInt(st.nextToken().trim()); 
      int b = Integer.parseInt(st.nextToken().trim()); 

      int c = (a^b)&-(a^b); //this is the key to solve the question 

      String ans = Integer.toBinaryString(c); 
      int size = ans.length(); 
      int position = 1; 

      while(size-->0){ 
       if(ans.charAt(size)=='0'){ 
        position++; 
       }else{ 
        break; 
       } 
      } 

      sb.append(position).append("\n"); 
     } 
     System.out.println(sb); 
    } 
} 
関連する問題