2016-09-25 100 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); 
    } 
}