【问题标题】:Integer to binary array整数到二进制数组
【发布时间】:2011-12-30 09:18:46
【问题描述】:

我正在尝试将整数转换为 7 位布尔二进制数组。到目前为止,代码不起作用: 如果我输入要转换的整数 8,而不是 0001000,我得到 1000000,或者说 15 我应该得到 0001111 但我得到 1111000。char 数组的长度与二进制数组不同,位置错误。

public static void main(String[] args){

    String maxAmpStr = Integer.toBinaryString(8);
    char[] arr = maxAmpStr.toCharArray();
    boolean[] binaryarray = new boolean[7];
    for (int i=0; i<maxAmpStr.length(); i++){
        if (arr[i] == '1'){             
            binaryarray[i] = true;  
        }
        else if (arr[i] == '0'){
            binaryarray[i] = false; 
        }
    }

    System.out.println(maxAmpStr);
    System.out.println(binaryarray[0]);
    System.out.println(binaryarray[1]);
    System.out.println(binaryarray[2]);
    System.out.println(binaryarray[3]);
    System.out.println(binaryarray[4]);
    System.out.println(binaryarray[5]);
    System.out.println(binaryarray[6]);
}

感谢任何帮助。

【问题讨论】:

  • 是作业吗?使用除以 2 和余数。
  • 您是否尝试过手动或使用调试器遍历您的代码?如果您使用 8 作为输入,两者都不是挑战,并且会让您看到结果开始偏离正确的地方。

标签: java arrays binary boolean


【解决方案1】:

char-array 只是需要的长度,因此您的 boolean-array 可能会更长并且将位放置在错误的位置。所以从后面开始,当你的字符数组完成后,用 0 填充你的布尔数组直到第一个位置。

【讨论】:

    【解决方案2】:

    提示:想想当你得到一个少于七个字符的字符表示时会发生什么。

    尤其要考虑char[]boolean[] 数组是如何“排列”的;一个元素会比另一个元素多,那么索引应该如何重合呢?


    实际答案:目前您正在使用字符数组的第一个元素作为布尔数组的第一个元素,这仅在您使用七字符字符串时才正确.实际上,您希望数组的 last 元素重合(以便将零填充在前面而不是末尾)。

    解决此问题的一种方法是使用循环中的索引(例如,计算大小差异并改为修改 binaryarray[i + offset])。但更简单的解决方案是在第一行之后用零填充字符串,以确保在将其转换为 char 数组之前正好是七个字符。

    (加分:当数组中有超过 7 个字符时,你会怎么做,例如,如果有人传入 200 作为参数?基于上述两种解决方案,你应该能够轻松检测到这种情况并处理它具体来说。)

    【讨论】:

      【解决方案3】:

      当你做System.out.println(maxAmpStr); 时你得到的是“1000”,如果是 8。 所以,你只会得到相关的部分,你期望的第一个“0000”被省略了。

      它不漂亮,但你可以做的是:

      for (int i=0; i<maxAmpStr.length(); i++)
      {
          if (arr[i] == '1')
          {
              binaryarray[i+maxAmpStr.length()-1] = true;
          }
          else if (arr[i] == '0')
          {
              binaryarray[i+maxAmpStr.length()-1] = false;
          }
      }
      

      【讨论】:

        【解决方案4】:

        Integer.toBinaryString(int i) 不填充。例如Integer.toBinaryString(7) 打印 111 而不是 00000111 如您所料。在决定从哪里开始填充布尔数组时,您需要考虑到这一点。

        【讨论】:

        • 即使 toBinaryString 打印了 00000111,这个程序仍然是不正确的,因为索引仍然不会在 char 和 boolean 数组之间“对齐”。 (事实上​​,它会因 IndexOutOfBoundsException 而失败,尽管可以很容易地解决这个问题以留下潜在的问题。)
        【解决方案5】:

        这个真的不需要处理字符串,只需对你感兴趣的 7 位进行逐位比较。

        public static void main(String[] args) {
        
            int input = 15;
        
            boolean[] bits = new boolean[7];
            for (int i = 6; i >= 0; i--) {
                bits[i] = (input & (1 << i)) != 0;
            }
        
            System.out.println(input + " = " + Arrays.toString(bits));
        }
        

        【讨论】:

        • +1 是一个如此简洁的例子,但您的回答可以解释为什么 OP 不起作用。
        • 好吧,我对 200+ bits 感兴趣,所以这个解决方案不起作用。你能给个建议吗?有没有办法使用boolean[] (bits) 或者我应该尝试Strings 吗?
        【解决方案6】:

        15.ToBinaryString 将是 '1111'

        你是从第一个字符到最后一个字符,所以第一个 '1' 是 bit(3) 进入 binaryArray[0] 我假设应该是 bit 0。

        您需要用前导零填充 ToBinaryString 到长度 7 (8 ??) 然后反转字符串,(或你的循环)

        或者您可以停止使用字符串,而只需使用位操作符

        BinaryArray[3] = (SomeInt && 2^3 != 0);

        ^ = 幂运算符,否则为 (1

        【讨论】:

        • 您是说Integer.toBinaryString(15) 吗?如果是这样,您介意编辑此答案吗?这是一个很好的方法。
        • 不是java人,所以我什至不知道你是否正确。认为这个想法很清楚。
        【解决方案7】:

        我会用这个:

        private static boolean[] toBinary(int number, int base) {
            final boolean[] ret = new boolean[base];
            for (int i = 0; i < base; i++) {
                ret[base - 1 - i] = (1 << i & number) != 0;
            }
            return ret;
        }
        

        以 7 为底的数字 15 将产生 {false, false, false, true, true, true, true} = 0001111b

        数字 8,基数 7 {假,假,假,真,假,假,假} = 0001000b

        【讨论】:

        • 这里使用base 有点误导,因为二进制总是以2 为底。也许length 更合适。事实上,您可以将length 计算为number 的上限以2 为底的对数。
        【解决方案8】:
            public static String intToBinary(int num) {
            int copy = num;
            String sb = "";
            for(int i=30; i>=0; i--) {
                sb = (copy&1) + sb;
                copy = copy >>>=1;
            }
            return sb;
        }
        
        1. AND 与 1 的数字
        2. 将值附加到字符串
        3. 做无符号右移 对 i=30..0 重复步骤 1-3

        【讨论】:

          【解决方案9】:
            public static boolean[] convertToBinary(int b){
              boolean[] binArray = new boolean[7];
              boolean bin;
              for(int i = 6; i >= 0; i--) {
                if (b%2 == 1) bin = true;
                else bin = false;
                binArray[i] = bin;
                b/=2;
              }
              return binArray;
            }
          

          【讨论】:

            【解决方案10】:
            String maxAmpStr = Integer.toBinaryString(255);
                char[] arr = maxAmpStr.toCharArray();
                boolean[] binaryarray = new boolean[20];
                int pivot = binaryarray.length - arr.length;
                int j = binaryarray.length - 1;
                for (int i = arr.length - 1; i >= 0; i--) {
                    if (arr[i] == '1') {
                        binaryarray[j] = true;
                    } else if (arr[i] == '0') {
                        binaryarray[j] = false;
                    }
                    if (j >= pivot)
                        j--;
                }
            
                System.out.println(maxAmpStr);
                for (int k = 0; k < binaryarray.length; k++)
                    System.out.println(binaryarray[k]);
            }
            

            【讨论】:

            • 如果您能进一步详细说明该代码 sn-ps 的全部内容,那就太好了,这将有助于未来的观众更好地理解。
            【解决方案11】:

            由于这里没有人知道动态数组长度的答案,这是我的解决方案:

            public static boolean[] convertToBinary(int number) {
                int binExpo = 0;
                int bin = 1;
                while(bin < number) { //calculates the needed digits
                    bin = bin*2;
                    binExpo++;
                }
                bin = bin/2;
                boolean[] binary = new boolean[binExpo]; //array with the right length
                binExpo--;
                while(binExpo>=0) {
                    if(bin<=number) {
                        binary[binExpo] = true;
                        number =number -bin;
                        bin = bin/2;
                    }else {
                        binary[binExpo] = false;
                    }
                    binExpo--;
                }
                return binary;
            }
            

            【讨论】:

            猜你喜欢
            • 2011-02-10
            • 1970-01-01
            • 1970-01-01
            • 2021-12-28
            • 2017-06-04
            • 2021-10-13
            • 2012-03-30
            • 1970-01-01
            • 2018-12-30
            相关资源
            最近更新 更多