Java 二元划分问题:互联网上的坏例子还是我遗漏了什么?
我想创建一个16位CRC。事实上我已经完全准备好了,所以几个小时前我测试了它,但没有正常工作。但我发现互联网上的例子可能是错误的,因为它是关于二进制划分的。我只链接了其中的两个(很多!): 所以我对二进制除法所做的是使用大整数。就这样,Java 二元划分问题:互联网上的坏例子还是我遗漏了什么?,java,binary,division,crc,Java,Binary,Division,Crc,我想创建一个16位CRC。事实上我已经完全准备好了,所以几个小时前我测试了它,但没有正常工作。但我发现互联网上的例子可能是错误的,因为它是关于二进制划分的。我只链接了其中的两个(很多!): 所以我对二进制除法所做的是使用大整数。就这样, BigInteger divisor = new BigInteger("10011", 2); BigInteger dividend = new BigInteger("11010110110000", 2); BigInteger[] result =
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。这是不对的,不是吗
如果你看到维基百科的例子,它再次给出了错误的答案,第一次和第二次计算都是错误的。当我用上面的代码计算它们时,它给出了一个很好的十进制结果。几乎所有我检查过的例子,我都得到了相同的结果。事实上,我到底错过了什么
--------------------------------------------------------
更新:工作代码
嘿,孩子们,正如我承诺的那样,我提供了一个使用CRC算法的完全wroking二进制除法!如果你想使用多项式算术,上面的代码是完全可以的!!只需使用getrements()
方法并添加两个字符串,它就会计算余数记住:如果您的位正确到达,剩余的将是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;
}
}
公共类二进制划分{
字符串减法;
公共二进制分区(){
}
公共字符串getrements(字符串被除数、字符串除数){
int dividendLength=divident.length();
整型除数长度=除数长度();
字符串商=”;
字符串已检查p=“”;
字符串除数=”;
删去“”;
整数指数;
整数减零=0;
对于(int i=0;i请参见第一个链接中的第五章:它们使用“CRC算法”。与“正常”算法的主要区别在于它们不使用进位。第五章中显示的加法示例比除法更容易理解,并显示了差异:
10011011
+11001010
--------
01010001
在使用进位的普通算术中,这将是
10011011
+11001010
--------
101100101
因为BigDecimal使用“normal”算术,得到的结果与参考文献中显示的结果不同。Hmmm。这真的是个问题。。你不知道java是否使用类似的BigDecimal和CRC算术吗?我真的不想修改它的数学,更不用说它非常紧迫,我没有时间……因为我看到我必须修改数学。谢谢你的回答!)