Matlab:如何使用'bitxor'获得比2更多的输入?

时间:2013-04-28 18:27:40

标签: matlab

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

我需要计算' bitxor'超过两个输入。我有一个intputs / elements的向量,其中输入/元素的数量不同。例如,在四元素Vector的情况下,解决方案如下:

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

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

有没有什么方法可以用更一般的方式写这个,这样无论向量Y中有多少输入元素,我得到一个值/ elemet?

3 个答案:

答案 0 :(得分:1)

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

如果特定列号中的总和是偶数,那么该列将在最终(二进制)结果中保留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

答案 1 :(得分:0)

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

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))

答案 2 :(得分:0)

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

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

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