找到最右边的位

时间:2016-09-25 16:11:46

标签: bit xor bits

我坚持这个问题。谢谢你的帮助。

你给了两个整数,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到1次幂= 2。

5 个答案:

答案 0 :(得分:9)

在使用按位运算符后,我得到了!!答案是(n ^ m)& - (n ^ m)

我可以很容易地在ruby中完成这个操作而不使用按位运算符,将它们转换为二进制字符串并找到从右侧开始并返回(2 **位置)的第一个非匹配但是它必须是使用按位运算符的一个班轮是一个棘手的部分。

我赞扬瑞安指出我正确的方向。谢谢Ryan !!

答案 1 :(得分: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;
    }

答案 2 :(得分:0)

您的问题的答案是下面用java编写的代码。此代码的输入采用以下格式:

输入: 第一行输入包含一个整数T,表示测试用例的数量。 T测试案例如下。每个测试用例的第一行包含两个空格分隔的整数M和N.

示例:

Input:
2
11 9
52 4
Output:
2
5

二进制&#34; 11&#34;是&#34; 1011&#34; 和&#34; 9&#34;是&#34; 1001&#34;你可以看到第二位(来自R.H.S)是不同的,这应该是我们的答案。

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);
    }
}

答案 3 :(得分:0)

另一种方式:

int RightMostDiffBit(int M,int N){
    int count = 1;
    for(int i=0;i<32;i++){
       if((M & (count << i)) ^ (N & (count << i)))
         return i+1;
    }
    return -1;
}

答案 4 :(得分:0)

int main()
{
    int a,b,i=0, tempa,tempb;
    printf("enter values for elements a and b\n");
    scanf("%d %d", &a,&b);
    while(i<=31)
    {
        tempa= a&(1<<i);
        tempb= b&(1<<i);
        if((tempa^tempb))
        {
          printf("pos of different bit is %d\n",i);
          break;
        }
        i++;
    }
    return 0;
}