0

我需要获取矩阵内一系列数字的二进制表示,以便对另一个向量执行一些操作。

因此,假设我将获得2^4数字的二进制表示,即从 0 到 15。我知道我需要一个16x4矩阵。

我有这个代码:

int [][] a = new int[15][4];

for (int i = 0; i < a.length; i++) {
    a[i] = String.format("%5s", Integer.toBinaryString(i)).replace(' ', '0').toCharArray();
}

因此,作为二进制格式数字 a 的数组表示char[],我不能将其分配给a[i].

如果有什么方法可以在不循环 char 数组的情况下执行强制转换?

4

3 回答 3

2

不是我知道的。有一些不同的方法可以做到这一点,或者循环遍历二进制字符串的整数表示,如果您绝对不希望循环遍历 char 数组,则对每一步执行num%10和。num/10但是在这种情况下,循环遍历 char 数组似乎很简单。无论如何,这里是解决方案,我猜你不想要它......

int [][] a = new int[16][4];

for (int i = 0; i < a.length; i++) {
    char[] cArr = String.format("%4s", Integer.toBinaryString(i)).replace(' ', '0').toCharArray();
    for(int j = 0; j < a[0].length; j++)
        a[i][j] = Integer.parseInt(cArr[j]+"");

}
于 2013-11-14T20:13:12.003 回答
1

这是您要完成的任务的更简单的解决方案...

    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < a[0].length; j++) {
            a[i][a[0].length - 1 - j] = (i & (1 << j)) != 0 ? 1 : 0;
        }
    }

不是将整数 i 转换为字符串,然后用零替换空格,然后将其转换为数组,而是:

  1. 拿我。

  2. 取一个二进制数 A,在第 j 个位置只有 1(其他为零):A = (1 << j)

  3. 执行您的数字和数字 A 的合取(二进制位乘法)。这是通过以下方式完成的:(i & A)

  4. 如果那个位置有非零位,合取后你会得到A。如果有一个零位,你会得到0。

  5. 如果结果不为零,则 i 在第 j 个位置有非零位。否则那里为零。

使用按位运算的解决方案也会更快。

于 2013-11-14T20:31:58.073 回答
0

我相信仍然需要一个外部循环来遍历char[][] rows

int[] charArray2intArray(char[][] binary) {

    int[] numbers = new int[binary.length];
    int row = 0;
    for (char[] number: binary) {

        String bin = new String(number);
        numbers[row++] = Integer.parseInt(bin, 2);
    }

    return numbers;
}
于 2013-11-14T20:34:01.030 回答