Биткорная функция положительных и отрицательных значений в Matlab

1

Я выполняю битксор между двумя массивами. Это мой код Java

public class HelloWorld{

     public static void main(String []args){
        int SYMBOL_SIZE=3;
        byte[][] D = new byte[2][SYMBOL_SIZE];
        D[0][0]=57;
        D[0][1]=22;
        D[0][2]=82;

        D[1][0]=23;
        D[1][1]=0;
        D[1][2]=-60;
        for (int j=0; j<SYMBOL_SIZE; j++)
            {
            //System.out.print((byte) (D[1][j]));
            D[1][j]=(byte) (D[1][j] ^ D[0][j]);
            System.out.print(D[1][j]);
            System.out.println();
            }

     }
}

Возврат результата

46                                                                                          
22                                                                                          
-106

Теперь я хочу выполнить эту функцию выше в MATLAB. Я проверил, что ^ операция в JAVA похожа на bitxor в matlab. Это правильно? Однако, когда я запускаю его в matlab, он имеет ошибку. Это мой код matlab

SYMBOL_SIZE=3;
D=zeros(2,SYMBOL_SIZE);
D(1,1:SYMBOL_SIZE)=[57,22,82];
D(2,1:SYMBOL_SIZE)=[23,0,-60];
%% Perform ^ operation
Result=bitxor(D(1,1:SYMBOL_SIZE),D(2,1:SYMBOL_SIZE));

В результате

Error using bitxor
Inputs must be non-negative integers.

Как достичь результата выглядят как JAVA-код на языке MATLAB? Заранее спасибо

  • 1
    Попробуйте 196 вместо -60. Вы получите 150, но это тот же битовый шаблон, что и -106.
  • 0
    Да, но я должен проверить знак каждого значения перед реализацией bitxor, верно? После этого я должен преобразовать это снова. Например, результат 196 битхора с 82 равен 150. После этого конечный результат равен 150-256 = -106. Это неудобство?
Показать ещё 3 комментария
Теги:

1 ответ

1
Лучший ответ

По документации bitxor "если [оба аргумента] являются двойными массивами, а assumedtype не указан, то MATLAB рассматривает integ1 и integ2 как неподписанные 64-битные целые числа ".

Таким образом, вам просто нужно предоставить assumedtype который может принимать отрицательные значения (т. assumedtype Любой тип int без ведущего u), как

Result=bitxor(D(1,1:SYMBOL_SIZE),D(2,1:SYMBOL_SIZE),'int64');

В версиях MATLAB до R2012b (R2012a bitxor) вам может потребоваться явно вводить входы, и они должны быть неподписанными. Чтобы использовать подписанные числа, вам нужно сделать какое-то литье, чтобы получить точное:

a = int64(D(1,1:SYMBOL_SIZE));
b = int64(D(2,1:SYMBOL_SIZE));
a = typecast(a,'uint64');
b = typecast(b,'uint64');
Result = typecast(bitxor(a,b),'int64');

Но обратите внимание, что теперь Result будет иметь тип int64 (или что бы вы ни int64), и преобразование обратно в double должно быть сделано явно, если необходимо:

Result=double(Result);

Скорее всего, был добавлен параметр assumedtype типа, чтобы сделать этот тип преобразования менее громоздким.

  • 0
    Имеется ошибка «Ошибка использования битхора. Слишком много входных аргументов».
  • 0
    Я использую Matlab 2012.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню