从整数形成位模式

时间:2019-04-06 10:52:48

标签: java algorithm

我需要帮助设计Java代码,以通过以下方式为任何给定的整数生成位数组:

23的输出应为1101011(最小长度数组) 说明:

位置以1 -2 4 -8 16 -32 ....

给出

因此1101011可以被评估为:

1*1 + 1*-2 + 0*4+ 1*-8 + 0*16 +1*-32 + 1*64 = 23

2 个答案:

答案 0 :(得分:5)

这是数字的 nebinbinary 表示形式(最早由VittorioGrünwald于1885年描述)。可以用与通常的二进制表示形式非常相似的方式对它们进行编码,只需将-2而不是2作为基础即可使用(受https://en.wikipedia.org/wiki/Negative_base上C#代码启发的Java代码):

class EncodeNegaBinary {

  public static void main(String[] args) {

    int n=0,input=0;
    String result="";
    final String[] BITS = { "0","1" };

    if (args.length != 1) {
      System.err.println("Please enter an integer to be converted");
      return;
    } else {
      input = n = Integer.parseInt(args[0]);
    }

    while (n != 0) {
      int r = n%-2;
      n /= -2;
      if (r == -1) {
        r=1;
        n++;
      }
      result = BITS[r] + result;
    }

    System.out.printf( "%d -> %s\n", input, result);

  }
}

答案 1 :(得分:1)

由于通常不会进行int到二进制的转换,因此在每个步骤中我们都需要考虑两种情况,因为在每个位置只能有两个选择0或1。这是在以下程序中递归完成的:

public class ModifiedIntToBinaryConversion{

    public static int calcBinaryString(int reqSum, int currSum, int add, String bs) {

        if (reqSum == currSum) {     // base condtion 1
            System.out.println("The string is \n" + bs);
            return currSum;
        }

        if (add + currSum > reqSum) {   // base condtion 2
            return 0;
        }

        int newAdd = add * -2;

        // System.out.println("new add is "+ newAdd +" currSum is "+ currSum);
        int s1 = calcBinaryString(reqSum, currSum + add, newAdd, bs + "1");

        if (s1 == reqSum)
            return s1;

        int s2 = calcBinaryString(reqSum, currSum, newAdd, bs + "0");
        return s2;
    }

    public static void calcBinaryString(int sum) {
        int s1 = calcBinaryString(sum, 0, 1, "");
        if(s1 != sum) {
            System.out.println("The binary equivalent couldn't be found");
        }
    }

    public static void main(String[] args) {
        calcBinaryString(23);
    }
}

现在基本条件1很清楚,因为我只是在检查所需的总和与计算的总和是否相等。

对于基本条件2,我将接受它的调试结果,并在遇到Stackoverflow错误时稍加思考。一旦计算出的总和变得比所需的总和大,然后我们取下一个-ve数,以使其小于req。和。但是,下一个+ ve数将大于我们刚刚考虑的-ve数,因此,计算出的总和等于req的机会非常小。总和。