Скопируйте справку конструктора, пытаясь скопировать логический массив.Джава - PullRequest
5 голосов
/ 24 июля 2011

Я просмотрел как можно больше предыдущих вопросов, но никогда не видел вопроса, в котором переменная была бы логическим массивом.

Вот мой класс:

public class Register {

private boolean[] register;
private int length;

    //Normal constructor
public Register(int n) {

    if (n == 8 || n == 16 || n == 32 || n == 64) {

        length = n;
        register = new boolean[length];

        for (int i = 0; i < length; i++) {

            register[i] = false;
        }

    } else {

        throw new RegisterException(
                "A register can only contain 8, 16, 32, or 64 bits");
    }

}

// Creates a copy of reg (an existing Register)
public Register(Register reg) {

    length = reg.length;
    register = new boolean[reg.register.length];

    System.arraycopy(reg.register, 0, this.register, 0, reg.register.length);
}

В моей программе драйвера я загружаю «1101101» в register1, но когда я делаю: Register register2 = новый регистр (register1);

и распечатайте оба результата, которые я получу:

0000000001101101

0000000000010110

Не совсем уверен, что происходит. Любая помощь будет признательна, спасибо!

Это мой метод загрузки. я отложил его здесь, потому что это может быть трудно читать:

public void load(String binaryRep) {

    String allTheBits = binaryRep;
    int charPosition = 0;
    int loadLength;
    int binaryNum = 0;
    String index = "";
    String trimmedIndex = "";

    if (allTheBits.length() > 0 && allTheBits.length() <= length) {

        loadLength = allTheBits.length();

        for (int i = length - (loadLength); i < length; i++) {

            index = allTheBits.charAt(charPosition) + "";
            trimmedIndex = index.trim();
            binaryNum = Integer.parseInt(trimmedIndex);

            if (binaryNum == 1) {

                register[i] = true;

            } else if (binaryNum == 0) {

                register[i] = false;
            }

            charPosition++;

        }
    } else {
        throw new RegisterException("You can only load 0 - " + length
                + "bits.");
    }
}

Ответы [ 3 ]

4 голосов
/ 24 июля 2011

Вот более идиоматический способ сделать это (используя интерфейс Cloneable):

public class Register implements Cloneable {

private boolean[] register;

public Register(boolean[] register) {

    int n = register.length;

    if (n == 8 || n == 16 || n == 32 || n == 64) {
        this.register = register;
    } else {

        throw new IllegalArgumentException(
                "A register can only contain 8, 16, 32, or 64 bits");
    }

}

@Override
public String toString() {

    StringBuilder builder = new StringBuilder();

    for ( boolean b : this.register ) {
        builder.append( b ? "1" : "0" );
    }

    return builder.toString();
}

public Register( int n ) {
    this( new boolean[n] );
}

public int getLength() {
    return this.register.length;
}

@Override
public Register clone() {

    boolean[] clonedRegister = new boolean[this.register.length];

    System.arraycopy(this.register, 0, clonedRegister,0, this.register.length);

    return new Register( clonedRegister );
}

}

И тест JUnit, показывающий это в действии:

import org.junit.Assert;
import org.junit.Test;


public class RegisterTest {

    @Test
    public void testRegisterToString() {

        Register source = new Register( new boolean[] {true, true, false, false, true, false, true, false } );

        String result = "11001010";

        Assert.assertEquals( result, source.toString() );

    }

    @Test
    public void testRegisterCloning() {

        Register source = new Register( new boolean[] {true, true, false, false, true, false, false, false } );
        Register clone = source.clone();

        Assert.assertEquals( source.toString(), clone.toString() );

    }

}
3 голосов
/ 24 июля 2011

Несколько замечаний, чтобы вы выучили некоторые базовые вещи.

  1. Как сказал @Ted, нет необходимости сохранять поле длины в качестве регистра. длина даст вам столько же
  2. Локальные переменные не инициализируются значениями по умолчанию, а массивы, так как они хранятся в куче. Так что нет необходимости перебирать массив «register», чтобы установить все его позиции в false
  3. Использование массива логических значений для этого, возможно, показалось простым, но с его чрезвычайно неэффективной памятью, поскольку каждый логический тип занимает по меньшей мере 32 бита в куче. Поэтому, чтобы представить 64-битный регистр, вы используете не менее 32 * 64 + 32 = 2080 битов ... использование байтового массива и побитовой логики будет немного сложнее, но, эй, это небольшая задача:)

В любом случае, ваш код выглядит нормально (кстати, используйте метод Arrays.copyOf, так как он более читабелен), поэтому ошибка должна исходить с другой стороны.

2 голосов
/ 24 июля 2011

Я только что проверил ваш метод загрузки следующим образом:

public static void main(String [] args)
{
    Register r1 = new Register(8);
    r1.load("1101101");
    Register r2 = new Register(r1);
    for (int i=0; i<8; i++) System.out.println(r2.register[i]);
}

Вывод:

> run Register
false
true
true
false
true
true
false
true
> 

Мне кажется, что содержимое объектов Register мне подходит,так что проблема, вероятно, связана с доступом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...