【问题标题】:find the different rightmost bit找到不同的最右边位
【发布时间】:2016-09-25 16:11:46
【问题描述】:

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

给你两个整数,n 和 m。找到它们在二进制表示中不同的最右边位的位置(保证存在这样的位),从右到左计数。

返回 2position_of_the_found_bit 的值(从 0 开始)。

例子

对于 n = 11 和 m = 13,输出应该是 不同的RightmostBit(n, m) = 2.

11 (下标 10) = 1011 (下标 2), 13 (下标) 10 = 1101 (下标 2),它们最右边的不同位是位置 1(从 0 开始)从右边开始的位二进制表示。 所以答案是 2 的 1 次方 = 2。

【问题讨论】:

  • 这是一个简单的问题,你做了什么?
  • 我刚开始学习位运算符。我想知道你是否可以给我一个提示,让我指出正确的方向。谢谢。
  • 一种方式:如果对它们进行异或运算,那么所有公共位都将设置为零,而将不匹配的位设置为。现在,从右边开始,找到第一个非零位的位位置。即右移或仅检查位位置。
  • 好的,谢谢瑞恩!我会试试的。
  • 感谢瑞恩的帮助!!

标签: bit xor bits


【解决方案1】:

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

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

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

【讨论】:

  • 学习二进制运算...当你二进制和一个负数和正数时会发生什么?
【解决方案2】:

由于所有整数都存储在 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;
    }

【讨论】:

  • 感谢拉胡尔的帮助。忘了说它必须是一个班轮,你可以在上面看到我的聪明解决方案。
  • 是的,我检查了你的方法,但是如果我们需要从右边的值不同的地方打印第二个索引或第三个索引怎么办,在这种情况下,你将不得不一次又一次地更改你的公式,但在这里只需更改数组“a”的第二个或第三个最后元素“k-2 或 k-3”的索引。 @brewersfan1976
【解决方案3】:

你的问题的答案是下面用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);
    }
}

【讨论】:

    【解决方案4】:

    另一种方式:

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

    【讨论】:

      【解决方案5】:
      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-02-23
        • 1970-01-01
        • 2021-03-25
        • 2021-01-08
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        相关资源
        最近更新 更多