2016-09-25 60 views
1

我被困在這個問題上。感謝你的協助。找到不同的最右邊位

給出兩個整數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開始)的位。 所以答案是2的第一個功率= 2.

+0

這是一個簡單的問題,你做了什麼? –

+0

我剛開始學習按位運算符。我想知道你能不能給我一個提示,讓我指出正確的方向。謝謝。 – brewersfan1976

+0

單向:如果你對它們進行異或運算,那麼所有的公共位將被設置爲零,並將它們設置在不匹配的位置。現在,從右邊開始,找到第一個非零位的位位置。即右移或僅檢查位的位置。 –

回答

0

由於所有整數存儲在一個32位寄存器中,因此我們需要檢查所有這32個寄存器中的值,因爲在第32個寄存器中我們需要1從右開始33 -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的幫助。忘了提及它需要成爲一個班輪,你可以看到我上面的聰明解決方案。 – brewersfan1976

+0

是的,我檢查了你的方法,但是如果我們需要從右側打印第二個索引或第三個索引,在這種情況下值不同的情況下,你將不得不一次又一次地改變你的公式,但是這裏只是將索引改爲第二或第三個元素數組「a」的「k-2或k-3」。 @ brewersfan1976 –

7

玩弄按位運算符後,我明白了!答案是(n^m)& - (n^m)

我可以很容易地做到這一點在紅寶石沒有使用按位運算符通過將它們轉換爲二進制字符串,並找到第一個不匹配從右邊開始並且返回(2 **位置),但它被要求成爲一個使用位運算符的單線程,這是棘手的部分。

我讚揚瑞恩指出我在正確的方向。謝謝瑞恩!

+0

學習二元運算以及......二元和負數和正數會發生什麼? –

+0

這是正確的答案 – Viet

0

您的問題的答案是寫在這個代碼的java.The輸入在以下格式是下面的代碼:

輸入: 輸入的第一行包含表示的數目的單個整數t測試用例。 T測試用例如下。每個測試用例的第一行包含兩個空間隔開的整數M和N.

實施例:

Input: 
2 
11 9 
52 4 
Output: 
2 
5 

在二進制「11」是「1011」 和「9」是「1001」,當你可以看到第二位(來自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); 
    } 
} 
相關問題