Java 比较两个十六进制字符串以查找匹配的位数

Java 比较两个十六进制字符串以查找匹配的位数,java,c++,hash,hex,bits,Java,C++,Hash,Hex,Bits,我有两个十六进制字符串: string x = "928fe46f228555621c7f42f3664530f9"; string y = "56cd8c4852cf24b1182300df2448743a"; 我试图将它们转换为二进制,以找出两个十六进制字符串之间有多少位匹配 我使用此函数将十六进制转换为二进制: string GetBinaryStringFromHexString (string sHex) { string sReturn = ""; for

我有两个十六进制字符串:

string x = "928fe46f228555621c7f42f3664530f9";
string y = "56cd8c4852cf24b1182300df2448743a";
我试图将它们转换为二进制,以找出两个十六进制字符串之间有多少位匹配

我使用此函数将十六进制转换为二进制:

 string GetBinaryStringFromHexString (string sHex)
 {
     string sReturn = "";
     for (int i = 0; i < sHex.length (); ++i)
     {
         switch (sHex [i])
         {
             case '0': sReturn.append ("0000"); break;
             case '1': sReturn.append ("0001"); break;
             case '2': sReturn.append ("0010"); break;
             case '3': sReturn.append ("0011"); break;
             case '4': sReturn.append ("0100"); break;
             case '5': sReturn.append ("0101"); break;
             case '6': sReturn.append ("0110"); break;
             case '7': sReturn.append ("0111"); break;
             case '8': sReturn.append ("1000"); break;
             case '9': sReturn.append ("1001"); break;
             case 'a': sReturn.append ("1010"); break;
             case 'b': sReturn.append ("1011"); break;
             case 'c': sReturn.append ("1100"); break;
             case 'd': sReturn.append ("1101"); break;
             case 'e': sReturn.append ("1110"); break;
             case 'f': sReturn.append ("1111"); break;
         }
     }
     return sReturn;
 }
string GetBinaryStringFromHexString(字符串sHex)
{
字符串sReturn=“”;
对于(int i=0;i
所以二进制中的字符串x是--> 10010010100011111100100010111100100100001000001010101010101010110000110001111111101000010111111100100110110011001000101001100001111001

二进制中的字符串y为-->010101101100110110001100010010000010100101100111100100100101100011000000001000000110111110010010010000011010

但是现在我被卡住了,我如何对这两个字符串进行异或运算以找到匹配位数?我怎么能数呢

不管我用的是java还是C++,有谁可以帮助< /p>
谢谢你,你有两条线。为什么不一个字符一个字符地浏览它们,看看它们是否匹配?将计数器初始化为零,并开始为每个匹配递增计数器,并在循环结束时显示。简单得多

这里是一个单行程序解决方案(利用世界上所有库的强大功能):


你有两条线。为什么不一个字符一个字符地浏览它们,看看它们是否匹配?将计数器初始化为零,并开始为每个匹配递增计数器,并在循环结束时显示。简单得多

这里是一个单行程序解决方案(利用世界上所有库的强大功能):


在Java中,这非常简单

public static int numberOfMatchingOnes(String a, String b) {
    BigInteger aNumber = new BigInteger(a, 16);
    BigInteger bNumber = new BigInteger(b, 16);

    return aNumber.xor(bNumber).bitCount();
}
<>在C++中,你可以使用一个位集。你要找的东西叫做

如果您确实想不使用BigInteger执行此操作: 取两个字符串的4个字符,将它们转换为整数,对它们进行异或运算,并计算1位。重复,直到字符串结束

public static int numberOfMatchingOnes(String a, String b) {
    if (a.length() != b.length() || a.length() % 4 != 0) {
        throw new IllegalArgumentException("invalid strings");
    }

    int totalCount = 0;
    for (int i = (a.length()-1)/4; i >= 0; i--) {
        int aValue = Integer.valueOf(a.substring(i * 4, i * 4 + 4), 16);
        int bValue = Integer.valueOf(b.substring(i * 4, i * 4 + 4), 16);
        totalCount += Integer.bitCount(aValue ^ bValue);
    }
    return  totalCount;
}

您可以通过查看查看
bitCount()
的工作原理。

在Java中,这非常简单

public static int numberOfMatchingOnes(String a, String b) {
    BigInteger aNumber = new BigInteger(a, 16);
    BigInteger bNumber = new BigInteger(b, 16);

    return aNumber.xor(bNumber).bitCount();
}
<>在C++中,你可以使用一个位集。你要找的东西叫做

如果您确实想不使用BigInteger执行此操作: 取两个字符串的4个字符,将它们转换为整数,对它们进行异或运算,并计算1位。重复,直到字符串结束

public static int numberOfMatchingOnes(String a, String b) {
    if (a.length() != b.length() || a.length() % 4 != 0) {
        throw new IllegalArgumentException("invalid strings");
    }

    int totalCount = 0;
    for (int i = (a.length()-1)/4; i >= 0; i--) {
        int aValue = Integer.valueOf(a.substring(i * 4, i * 4 + 4), 16);
        int bValue = Integer.valueOf(b.substring(i * 4, i * 4 + 4), 16);
        totalCount += Integer.bitCount(aValue ^ bValue);
    }
    return  totalCount;
}

您可以查看查看
bitCount()
的工作原理。

这取决于您的目的如果您想找到它们在哪里匹配,可以使用 在C中:

#包括
整数toBinary(无符号整数b1,无符号整数b2){
无符号整数b=b1&b2;
printf(“%x&%x=%x\n”,b1、b2、b);
}
int main(){
int i,a,b;
无符号整数b1=0x100100;
无符号整数b2=0x010101;
托比纳里(b1,b2);
返回0;
} 
上面的代码从右到左比较二进制数字,如果两位为1,则返回1,否则返回0

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

如果您想找到相同或不相同的位置,请使用XOR 在C中:

#包括
整数toBinary(无符号整数b1,无符号整数b2){
无符号整数b=b1^b2;
printf(“%x&%x=%x\n”,b1、b2、b);
}
int main(){
int i,a,b;
无符号整数b1=0x100100;
无符号整数b2=0x010101;
托比纳里(b1,b2);
返回0;
} 

这取决于你的目的如果你想找到它们在哪里匹配,你可以使用 在C中:

#包括
整数toBinary(无符号整数b1,无符号整数b2){
无符号整数b=b1&b2;
printf(“%x&%x=%x\n”,b1、b2、b);
}
int main(){
int i,a,b;
无符号整数b1=0x100100;
无符号整数b2=0x010101;
托比纳里(b1,b2);
返回0;
} 
上面的代码从右到左比较二进制数字,如果两位为1,则返回1,否则返回0

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

如果您想找到相同或不相同的位置,请使用XOR 在C中:

#包括
整数toBinary(无符号整数b1,无符号整数b2){
无符号整数b=b1^b2;
printf(“%x&%x=%x\n”,b1、b2、b);
}
int main(){
int i,a,b;
无符号整数b1=0x100100;
无符号整数b2=0x010101;
托比纳里(b1,b2);
返回0;
} 

一旦将它们转换为二进制,只需使用xor。。。如果它们相等,则为0,否则在不同的位上会给出1…@回答错误,我认为您根本不想对字符串进行异或运算。@HunterMcMillen,因此我以“一旦将它们转换为二进制…”开头,可能出现重复的oops,该注释应该是@Pedro XYZE一旦您将它们转换为二进制,只需使用异或即可。。。如果它们相等,则为0,否则在不同的位上会给出1…@回答错误,我认为您根本不想对字符串进行异或运算。@HunterMcMillen,所以我以“一旦将它们转换为二进制…”开头,可能是重复的oops,该注释应该是@Pedro Xyze+1表示位计数()-比我的解决方案效率高得多。+1表示位计数()-比我的解决方案效率高得多。
#include <stdio.h>
int toBinary(unsigned int b1,unsigned int b2){
unsigned int b = b1 ^ b2;
printf("%x & %x = %x\n",b1,b2,b);
}
int main(){
int i,a,b;
unsigned int b1 = 0x100100;
unsigned int b2 = 0x010101;
toBinary(b1,b2);
return 0;
}