【问题标题】:Binary divison java implementation二进制除法java实现
【发布时间】:2014-10-22 23:11:50
【问题描述】:

这可能是一个奇怪的问题,但我没有发现任何二进制除法 java 实现浏览互联网。我会将它用于 CRC16 编码,因此转换为十进制不是解决方案。我理解纸上的方法,但我是初学者,因为它非常重要,我不想弄错。我唯一发现的是 code.google.com 上的 CRC.java,它使用二进制除法,但即使我只使用除法部分(删除其他部分),我也没有得到理想的值。

任何人都可以告诉我它的java实现吗?我会非常感激!提前致谢

我找到的代码:

公共类 CRC { 私有字符串数据,除数;

public CRC(String d, String di) {
    this.data = d;
    this.divisor = di;
}
public String getRemainder(String data, String divisor) {
    int x = 1, z = divisor.length(), j = 0, i;
    String data2 = "", strOfZeros = "";
    int y = divisor.length() - 1;
    /* This is to get correct amount of zero's onto the end of the data */
    while (y > 0) {
        data += "0";
        y--;
    }
    // Main part of method, this is the long division of Binary numbers.
    needToExit: for (i = x, j = 1; i < z && z <= data.length(); i++, j++) {
        if (z == data.length() && data2.charAt(0) == '1') {
            strOfZeros = "";
            for (i = 1; i < divisor.length(); i++) {    
                if (data2.charAt(i) == divisor.charAt(i))
                    strOfZeros += '0';
                else
                    strOfZeros += '1';
            }
            data2 = strOfZeros;
            break needToExit;
        }

        if (data.charAt(i) == divisor.charAt(j))
            data2 += "0";
        else
            data2 += "1";

        if (i == divisor.length() - 1) {
            data2 += data.charAt(z);
            x++;
            z++;
            // i = x;
            j = 0;

            // when first bit is a 0
            while (data2.charAt(0) != '1' && i == divisor.length() - 1) {
                for (i = 1; i < divisor.length(); i++) {
                    if (data2.charAt(i) == '0')
                        strOfZeros += "0";
                    else
                        strOfZeros += "1";
                }
                strOfZeros += data.charAt(z);
                data2 = strOfZeros;
                strOfZeros = "";
                x++;
                z++;
                i = x;
            }
        }

    }
    return data2;
}
public String getDataPlusCRC(String data){
    String str = data.concat(getRemainder(this.data, this.divisor));
    return str;
}

}

当我尝试除以数字时,getRemainder() 方法给了我一个糟糕的结果。而这部分不是必需的,因为它需要CRC。

while (y > 0) {
            data += "0";
            y--;
        }

【问题讨论】:

标签: java binary division


【解决方案1】:

BigInteger 可以做以 2 为底的除法;

    BigInteger divisor = new BigInteger("10", 2);
    BigInteger dividend = new BigInteger("100", 2);
    BigInteger result = dividend.divide(divisor);

    System.out.println(result.toString(2));

【讨论】:

  • 我必须将 1400 位整数除以 16 位整数。它可以用这个吗?
  • BigInteger 可以表示任何大小的整数并对其执行操作。
  • 其实我也需要余数,它只给了我商。我错过了什么吗?
  • @JaniBela 看看 BigInteger 类提供给您的方法:docs.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html - 我相信您可以弄清楚如何同时获得余数和商。在处理不熟悉的类时,您应该始终查阅 API。
  • 非常感谢你,现在我可以为我的 CRC 试试 :)
猜你喜欢
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多