[英]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.