我希望有人可以帮我解决这个问题:
我需要计算' bitxor'超过两个输入。我有一个intputs / elements的向量,其中输入/元素的数量不同。例如,在四元素Vector的情况下,解决方案如下:
矢量:Y = [1 3 5 7];
解决方案:bitxor(bitxor(Y(1),Y(2)),bitxor(Y(3),Y(4)));
有没有什么方法可以用更一般的方式写这个,这样无论向量Y中有多少输入元素,我得到一个值/ elemet?
答案 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)