找到最右边不同的位

问题描述 投票:0回答:6

我被这个问题困扰了。感谢您的帮助。

给定两个整数,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。

xor bit
6个回答
11
投票

在尝试了按位运算符之后,我明白了!答案是 (n ^ m) & -(n ^ m)

我可以在 ruby 中轻松完成此操作,而无需使用按位运算符,方法是将它们转换为二进制字符串并找到从右侧开始并返回(2 ** 位置)的第一个不匹配项,但它需要是一个单行符使用按位运算符是棘手的部分。

我感谢 Ryan 为我指明了正确的方向。谢谢瑞安!!


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
投票

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

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

示例:

Input:
2
11 9
52 4
Output:
2
5

二进制“11”是“1011” “9”是“1001”,正如你所看到的,第二位(来自 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);
    }
}

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

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

0
投票

解决这个问题的一种方法是对两个输入进行异或运算。 异或运算后,相同的位将被设置为零,不同的位将被设置(==1)(如 1 ^ 0 == 1 和 1 ^ 1 == 0)。 然后找到最右边设置位的位置。

int posOfRightMostDiffBit(int m, int n)

{

if(m == n){ return -1; }

int xor_val = m ^ n;
int pos = 1;
while(xor_val > 0)
{
    if(xor_val & 1)
    {
        return pos;
    }
    pos++;
    xor_val = xor_val >> 1;
}
return -1;

}

© www.soinside.com 2019 - 2024. All rights reserved.