我被这个问题困扰了。感谢您的帮助。
给定两个整数,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。
在尝试了按位运算符之后,我明白了!答案是 (n ^ m) & -(n ^ m)
我可以在 ruby 中轻松完成此操作,而无需使用按位运算符,方法是将它们转换为二进制字符串并找到从右侧开始并返回(2 ** 位置)的第一个不匹配项,但它需要是一个单行符使用按位运算符是棘手的部分。
我感谢 Ryan 为我指明了正确的方向。谢谢瑞安!!
由于所有整数都存储在 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;
}
您的问题的答案是下面用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);
}
}
还有一种方法:
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;
}
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;
}
解决这个问题的一种方法是对两个输入进行异或运算。 异或运算后,相同的位将被设置为零,不同的位将被设置(==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;
}