2016-09-25 4 views
1

Я застрял на этой проблеме. Спасибо за вашу помощь.найти другой самый правый бит

Вам даны два целых числа, n и m. Найдите позицию самого правого бита, в котором они отличаются в своих двоичных представлениях (гарантируется, что такой бит существует), считая справа налево.

Возвращает значение 2position_of_the_found_bit (0).

Пример

При п = 11 и т = 13, выходной сигнал должен быть differentRightmostBit (п, т) = 2.

11 (индекс 10) = 1011 (нижний индекс 2), 13 (индекс 10 = 1101 (индекс 2), самый правый бит, в котором они отличаются, - бит в позиции 1 (основанный на 0) справа в двоичных представлениях. Итак, ответ 2 на 1-ю степень = 2.

+0

Это простая проблема, что вы сделали? –

+0

Я только начал изучать побитовые операторы. Мне было интересно, можете ли вы дать мне подсказку, чтобы указать мне в правильном направлении. Благодарю. – brewersfan1976

+0

в одну сторону: если вы XOR их, то все обычные биты будут установлены в ноль, оставив биты, установленные там, где они не совпадают. Теперь начните с правой стороны и найдите битную позицию первого ненулевого бита. т.е. сдвиг вправо или просто проверка позиций бит. –

ответ

0

Поскольку все целые числа хранятся в 32-битном регистре, поэтому нам нужно проверить значение во всех этих 32-х регистрах сейчас, так как в 32-м регистре нам требуется 1 справа, поэтому 33 -32 = 1 и, наконец, 33-a [k-1] для ответа. Здесь я просто сохранил позиции, где двоичное значение неравномерно в массиве «a», и напечатал последний элемент в массиве, даже работая для целых чисел.

#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

благодарит Рахула за вашу помощь. Забыв упомянуть, что это был один лайнер, вы можете увидеть мое умное решение выше. – brewersfan1976

+0

Да, я проверил ваш метод, но что, если нам нужно распечатать второй индекс или третий индекс справа, где значения отличаются в этом случае, вам придется снова и снова менять формулу, но здесь просто измените индекс на второй или третий последний элемент «k-2 или k-3» массива «a». @ brewersfan1976 –

7

После игры с побитовыми операторами я получил это! Ответ: (n^m) & - (n^m)

Я мог бы легко сделать это в рубине без использования побитовых операторов, переведя их в двоичную строку и найдя первое несоответствие, начинающееся справа (2 **), но требовалось быть одним лайнером, используя побитовые операторы, которые были сложной частью.

Я отдаю должное Райану за то, что указал мне в правильном направлении. Спасибо, Райан!

+0

Изучение двоичных операций, а также ... что происходит, когда вы являетесь двоичным и отрицательным и положительным числом? –

+0

Это правильный ответ – Viet

0

Ответ ваш вопрос ниже код, написанный на java.The ввода этого кода в следующем формате:

Входной сигнал: Первая строка ввода содержит одно целое число T, который обозначает число тестовые примеры. T испытаний. Первая строка каждого теста содержит два целых числа пространства М и N.

Пример:

Input: 
2 
11 9 
52 4 
Output: 
2 
5 

В двоичной «11» «1011» и «9» есть «1001» и, как вы может видеть, что 2-й бит (из 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); 
    } 
} 
Смежные вопросы