你能帮我解释一下这段代码出错的原因吗?我想使用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
答案 0 :(得分:1)
为什么代码会产生错误?
让我们先列出错误:
使用bit和输入时出错必须是有符号或无符号整数 相同的班级或标量双打。
foo错误(第8行) 得分=比特(bitand(公共,negpassword),bitand(negpublic,密码));
好的,以下行产生错误:
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
答案 1 :(得分: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)))