2016-01-12 3 views
-3

Вы можете мне помочь и объяснить, почему этот код дает ошибку? Я хотел бы использовать XOR, но я не могу. Я пытаюсь сделать это, используя следующую формулу:.»A XOR B= (A AND ~B)OR(~A AND B) Можете ли вы намекнуть, что я сделал неправильноПочему код отображает ошибку?

public = 'public'; 
password = 'passwd'; 
if length(public)== length(password) 
    public = uint8(public); 
    password = uint8(password); 
    negpublic = ~(dec2bin(public)); 
    negpassword = ~(dec2bin(password)); 
    score = bitor(bitand(public,negpassword),bitand(negpublic,password)); 
    public = dec2bin(public); 
    password = char(password) 


else 
    fprintf('length not ok!\n'); 
end 
+2

Какая ошибка? – rayryeng

+1

Обратите внимание, что 'dec2bin' возвращает' char', так как Matlab в настоящее время не имеет типа битовых данных. Вместо этого используйте [бит-мутные операторы] (http://www.mathworks.com/help/matlab/bit-wise-operations.html) для целых чисел. – TroyHaskin

ответ

1

Обычно я не даю ответы на вопросы домашнего задания, но кажется, Вы почти там. Логика выполнена, и это была важная часть, которую я предполагаю.

Что касается кода, здесь есть несколько ошибок. Функция dec2bin обманет вас. Насколько мне известно, Matlab не поддерживает двоичный формат. dec2bin фактически преобразует число в массив char :(Однако наличие текста в двоичном формате не является обязательным требованием для выполнения побитовых операций. Я не могу видеть использование бинарного формата в Matlab, поскольку самый маленький блок данных для большинства Архитектура компьютера обычно представляет собой один байт.

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

ab = 'ab'; bb = 'bb'; 
ab=uint8(ab); bb=uint8(bb); 
bitor(bitand(ab,bitcmp(bb)), bitand(bb,bitcmp(ab))) 
+0

Спасибо за помощь :) Надеюсь, что я не буду мучить пользователей простых вопросов :) –

1

Почему выход кода ошибки

первый список Давайте ошибка?:

Error using bitand Inputs must be signed or unsigned integers of the same class or scalar doubles.

Error in foo (line 8) score = bitor(bitand(public,negpassword),bitand(negpublic,password));

Итак, следующая строка дает ошибку:

score = bitor(bitand(public,negpassword),bitand(negpublic,password)); 

Мы можем разорвать эти вниз и видим, что оба следующие выражения дают ошибку самой по себе

bitand(public,negpassword) 
bitand(negpublic,password) 

Почему? Если мы посмотрим на первый из этих двух немного ближе, мы видим, что public и negpassword и несоответствующим для использования с bitand:

public = 

    112 117 98 108 105 99 

negpassword = 

    0  0  0  0  0  0  0 
    0  0  0  0  0  0  0 
    0  0  0  0  0  0  0 
    0  0  0  0  0  0  0 
    0  0  0  0  0  0  0 
    0  0  0  0  0  0  0 

Эти два должны быть, по крайней мере, той же размерности , См. the reference for Bit-wise OR.

Я не совсем уверен, что вы пытаетесь достичь здесь, но не то, что Matlab имеет свою собственную bitxor функции:

public = 'public'; 
password = 'passwd'; 
if length(public)== length(password) 
    public = uint8(public); 
    password = uint8(password); 
    score = bitxor(public,password); 
    public = dec2bin(public); 
    password = char(password); 
else 
    fprintf('length not ok!\n'); 
end 
+0

Мой учитель запретил мне использовать BITXOR. Я должен найти другое решение .. –