gpt4 book ai didi

java - 二进制除法问题 : bad examples on internet or what am I missing?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:19 25 4
gpt4 key购买 nike

我想创建一个 16 位 CRC。实际上我已经完全准备好了,所以几个小时前我测试了它,但没有正常工作。但是我发现互联网上的示例在涉及二进制除法时可能是错误的。我只链接了其中两个(来自很多!):http://www.ross.net/crc/download/crc_v3.txt , http://en.wikipedia.org/wiki/Cyclic_redundancy_check

所以我对二进制除法所做的是我使用 BigIntegers。就像这样:

BigInteger divisor = new BigInteger("10011", 2);
BigInteger dividend = new BigInteger("11010110110000", 2);
BigInteger[] result = dividend.divideAndRemainder(divisor);

这些值可以在第一个链接中看到(6. 完整的示例)。让我们看看结果,引用给了我 1110 余数,我上面的代码给了我 111。可能是代码错误?我不这么认为..让我们用十进制计算:13744/19 = 723,余数是 7..所以代码给了我 111,实际上是十进制的 7,但是这个例子给了我 1110,也就是 14。这是错误的不是吗?

如果你看到维基百科的例子,它又给出了错误,无论是第一次还是第二次计算。当我用上面的代码计算它们时,它给了我一个很好的十进制结果。我检查的几乎所有示例都得到了相同的结果。所以实际上,我到底错过了什么?

-------------------------------------------- ----------

更新:工作代码

嘿, children ,正如我 promise 的那样,我提供了一个功能完备的二进制除法,它使用 CRC 算法!如果你想使用多项式算术,上面的代码完全可以!只需使用 getRemainder() 方法并添加两个字符串,它会计算余数。 记住:如果您的位正确到达,余数将为0!在这个例子中,它给你一个长度为 0 的字符串!尽情使用吧!

public class BinaryDivision {


String substracted;

public BinaryDivision(){

}

public String getRemainder(String dividend, String divisor){

int dividendLength = dividend.length();
int divisorLength = divisor.length();

String quotient="";
String examinedP="";
String divisorP="";
substracted="";

int indexNumber;
int substractZeros=0;


for (int i=0;i<divisorLength;i++){
examinedP = examinedP + dividend.charAt(i);
}


indexNumber = divisorLength;

for (int j=0;j<(dividendLength-divisorLength);j++){

//START
if ( Integer.parseInt(String.valueOf(examinedP.charAt(0)))==1){


quotient=quotient + "1";

int a = divisor.length();
//substracting
for (int i = 0;i<a;i++){
// System.out.println(examinedP.charAt(i) + " " + divisor.charAt(i));

substracted = substracted +
CRC_substract(Integer.parseInt(String.valueOf(examinedP.charAt(i))),
Integer.parseInt(String.valueOf(divisor.charAt(i))));
}

substracted = substracted.substring(1);
//----------------------------------------------
substracted = substracted + dividend.charAt(indexNumber);

}
else {
quotient=quotient + "0";
int a = divisor.length();

//substracting
for (int i = 0;i<a;i++){
//System.out.println(examinedP.charAt(i) + " " + 0);

substracted = substracted +
CRC_substract(Integer.parseInt(String.valueOf(examinedP.charAt(i))),
0);
}

substracted = substracted.substring(1);
substracted = substracted + dividend.charAt(indexNumber);

}

examinedP = substracted;
//System.out.print(examinedP);
substracted="";
//System.out.println(" "); System.out.println(" ");
indexNumber++;
}


//counting remainder - if it starts with 0 - bye bye 0s..
for (int i = 0;i<examinedP.length();i++){

if (Integer.parseInt(String.valueOf(examinedP.charAt(i)))==0){
substractZeros++;
}
else {
break;
}
}

examinedP = examinedP.substring(substractZeros);
// System.out.println(" "); System.out.println(" ");
// System.out.print(examinedP);

return examinedP;

}

//XOR - Exclusive OR
public int CRC_substract(int a, int b){

if (a==0 && b==0){
return 0;
}
else if (a==0 && b==1){
return 1;
}
else if (a==1 && b==0){
return 1;
}
else if (a==1 && b==1){
return 0;
}

return -1;
}



}

最佳答案

请参阅第一个链接中的第五章:他们正在使用“CRC 算术”。与“普通”算术的主要区别在于它们不使用进位。第五章中的加法示例比除法更容易理解,并显示了区别:

 10011011
+11001010
--------
01010001

在使用进位的正常算术中,这将是

 10011011
+11001010
--------
101100101

由于 BigDecimal 使用“正常”算术,您得到的结果与引用文献中显示的结果不同。

关于java - 二进制除法问题 : bad examples on internet or what am I missing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13297308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com