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