Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二元划分问题:互联网上的坏例子还是我遗漏了什么?_Java_Binary_Division_Crc - Fatal编程技术网

Java 二元划分问题:互联网上的坏例子还是我遗漏了什么?

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 =

我想创建一个16位CRC。事实上我已经完全准备好了,所以几个小时前我测试了它,但没有正常工作。但我发现互联网上的例子可能是错误的,因为它是关于二进制划分的。我只链接了其中的两个(很多!):

所以我对二进制除法所做的是使用大整数。就这样,

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算术吗?我真的不想修改它的数学,更不用说它非常紧迫,我没有时间……因为我看到我必须修改数学。谢谢你的回答!)