【问题标题】:Matlab: How to use 'bitxor' for more inputs than 2?Matlab:如何将“bitxor”用于超过 2 个的输入?
【发布时间】:2013-04-28 18:27:40
【问题描述】:

我希望有人可以帮助我解决这个特殊问题:

我需要为两个以上的输入计算“bitxor”。我有一个输入/元素的向量,其中输入/元素的数量会有所不同。比如四元素Vector,解决方法如下:

矢量:Y = [1 3 5 7];

解决方案:bitxor(bitxor(Y(1),Y(2)),bitxor(Y(3),Y(4)));

有什么方法可以让我以更通用的方式编写它,这样无论向量 Y 中有多少输入元素,我都会得到一个值/元素?

【问题讨论】:

  • 首先定义N个元素的通用数组的操作符

标签: matlab


【解决方案1】:

“信封背面”的解决方案似乎是将列表中的每个数字转换为二进制,并将每个位列中1s 的数量相加。

如果特定列号中的和为偶数,则该列将在您的最终(二进制)结果中包含 0,如果为奇数,则将包含 1

所以你的bitxor([1 3 5 7])例子:

0001 (dec 1)
0011 (dec 3)
0101 (dec 5)
0111 (dec 7)
====

按位求和:0224(显然不是以 2 为底)

通过上面的偶/奇规则转换:

0224 => bin 0000 (or dec 0)

我临时尝试了几个简单的例子,没有遇到异常。

所以一些代码来尝试解决方案:

Y = [1, 3, 5, 7];
strMat = dec2bin(Y); % Convert Y to char matrix of binary values

for i = 1:size(strMat,2)
    colSum = sum( str2num(strMat(:,i))); % Sum up each column
    finalVal(i) = num2str( mod(colSum,2)); % Check whether column sum is even
end

finalVal = bin2dec(finalVal); % Convert solution to decimal

【讨论】:

  • Ryan J. Smith - 谢谢!你拯救了我的早晨。看起来它适用于所有可能的情况。
【解决方案2】:

我现在将描述的解决方案远非最佳,但无论如何您都可以尝试一下:

Y1 = Y(1:2:end);
Y2 = Y(2:2:end);
arrayfun(@(i) bitxor(bitxor(Y1(i),Y2(i)),bitxor(Y1(i),Y2(i))),1:size(Y1,1))

【讨论】:

  • @user2329754:没关系,我不介意,由你选择你最喜欢的解决方案:)
【解决方案3】:

这是另一种解决方案,但它会覆盖原始向量。

Y = [1, 3, 5, 7];

for i=1:length(Y)-1
    Y(i+1) = bitxor(Y(i),Y(i+1)); 
end
finalVal = Y(end)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2017-01-03
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多