簡體   English   中英

比較兩個十六進制字符串以找到匹配的位數

[英]Compare two hex strings to find number of matching bits

我有兩個十六進制字符串:

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

所以二進制中的字符串x為-> 10010010100011111110010001101111001000101000010101010101011000100001110001111111010000101111001101100110010001010011000011111001

二進制中的字符串y是-> 010101101100110110001000110010010100100100100100100100101100010001100000100011000000001101111100100100010010000111010000111010

但是現在我被困住了,我如何才能對兩個字符串進行異或運算以找到匹配的位數? 我該如何計算呢?

我使用Java還是C ++都沒關系,任何人都可以幫忙嗎

謝謝,

在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個字符,將它們轉換為一個int,對它們進行異或,然后計算一位。 重復直到弦樂結束。

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

您可以查看Java源代碼以了解bitCount()工作方式。

您有兩個字符串。 為什么不逐個字符地瀏覽它們,看看它們是否匹配? 將計數器初始化為零,並為每個匹配開始遞增它們,並在循環結束時顯示。 簡單得多。

但是,這是一種單線解決方案(具有世界上所有圖書館的強大功能):

System.out.println(StringUtils.countMatches(new BigInteger("928fe46f228555621c7f42f3664530f9",16).xor(new BigInteger("56cd8c4852cf24b1182300df2448743a",16)).toString(2),"1"));

如果要找到它們匹配的位置,這取決於您的目的,可以在C中使用AND

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

上面的代碼從右到左比較二進制數,如果兩位為1,則返回1,否則返回0

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

如果要查找相同的地方或在C中不使用XOR:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM