我希望有人可以帮助我解决这个特殊问题:
我需要为两个以上的输入计算“bitxor”。我有一个输入/元素的向量,其中输入/元素的数量会有所不同。例如,在一个四元素向量的情况下,解决方案如下:
向量:Y = [1 3 5 7];
解决方案:bitxor(bitxor(Y(1),Y(2)),bitxor(Y(3),Y(4)));
有什么方法可以用更通用的方式编写它,这样无论向量 Y 中有多少输入元素,我都会得到一个值/元素?
我希望有人可以帮助我解决这个特殊问题:
我需要为两个以上的输入计算“bitxor”。我有一个输入/元素的向量,其中输入/元素的数量会有所不同。例如,在一个四元素向量的情况下,解决方案如下:
向量:Y = [1 3 5 7];
解决方案:bitxor(bitxor(Y(1),Y(2)),bitxor(Y(3),Y(4)));
有什么方法可以用更通用的方式编写它,这样无论向量 Y 中有多少输入元素,我都会得到一个值/元素?
一个“信封背面”的解决方案似乎是将列表中的每个数字转换为二进制并将1
每个位列中 s 的数量相加。
如果特定列号的总和是偶数,那么该列将0
在您的最终(二进制)结果中保存 a,如果它是奇数,它将保存 a 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
我现在将描述的解决方案远非最佳,但无论如何您都可以尝试一下:
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))
这是另一种解决方案,但它会覆盖原始向量。
Y = [1, 3, 5, 7];
for i=1:length(Y)-1
Y(i+1) = bitxor(Y(i),Y(i+1));
end
finalVal = Y(end)