【问题标题】:Why code displays error?为什么代码显示错误?
【发布时间】:2016-01-12 18:19:14
【问题描述】:

你能帮我解释一下为什么这段代码会出错吗?我想使用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

【问题讨论】:

  • 请注意,dec2bin 返回 char,因为 Matlab 目前没有位数据类型。在整数上使用bit-wise operators

标签: matlab logical-operators


【解决方案1】:

通常我不会为家庭作业问题提供答案,但您似乎就快到了。逻辑已经完成,这是我猜的重要部分。

关于代码,这里有一些错误。函数dec2bin 会欺骗你。据我所知,matlab 不支持二进制格式。 dec2bin 实际上将数字转换为 char 数组:(。但是,二进制格式的文本不是进行按位运算的要求。由于最小的数据单元,我真的看不到在 matlab 中使用二进制格式对于大多数计算机架构,通常是一个字节。

您可以使用函数bitcmp(按位补码,即按位非的另一个词)进行否定。其次,按位运算也可以对向量起作用。第三,可以将否定定义为变量,但对于大多数处理器和操作系统而言,位运算是最便宜的,因此坦率地说,这对于仅两种用途来说是不必要的。所以一切的内容就是你可以把事情简化很多。

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

【讨论】:

  • 谢谢你的帮助:) 希望我不会被用户简单的问题折磨:)
【解决方案2】:

为什么代码会产生错误?

我们先列出错误:

使用 bitand 时出错输入必须是有符号或无符号整数 相同的类或标量双精度。

foo 中的错误(第 8 行) score = bitor(bitand(public,negpassword),bitand(negpublic,password));

好的,所以下面一行会产生错误:

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

我们可以分解一下,看看下面的两个表达式都会产生错误

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

为什么?如果我们仔细观察这两个中的第一个,我们会发现 publicnegpassword 不符合与 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

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 2018-05-09
    • 2015-09-13
    • 2017-11-25
    • 2020-08-01
    • 2020-12-14
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多