Matlab只使用按位命令输入两个输入,例如bitor
。 bitor(1,2)
返回3
而bitor(1,2,4)
不返回7
,但是:
ASSUMEDTYPE必须是整数类型名称。
目前,我创建了for循环,基本上创建了一个按位命令,可以根据需要获取尽可能多的输入。我觉得这种东西的for-loops是重新发明轮子。
是否有一些简单的方法可以使用多个输入创建按位运算?
当前一个包含一些随机数的示例,必须返回127
indices=[1,23,45,7,89,100];
indicesOR=0;
for term=1:length(indices)
indicesOR=bitor(indicesOR,indices(term));
end
答案 0 :(得分:2)
如果你不介意涉及到字符串(可能很慢):
indicesOR = bin2dec(char(double(any(dec2bin(indices)-'0'))+'0'));
这使用dec2bin
转换为'0'
和'1'
的字符串;通过减去'0'
将数字转换为数字0和1;使用any
逐列应用“或”操作;然后转换回来。
对于AND(而不是OR):将any
替换为all
:
indicesAND = bin2dec(char(double(all(dec2bin(indices)-'0'))+'0'));
对于异或:使用rem(sum(...),2)
:
indicesXOR = bin2dec(char(double(rem(sum(dec2bin(indices)-'0'),2))+'0'))
编辑:我刚刚发现了函数de2bi
和bi2de
(通讯工具箱),它们避免使用字符串。但是,它们似乎更慢了!
indicesOR = bi2de(double(any(de2bi(indices))));
indicesAND = bi2de(double(all(de2bi(indices))));
indicesXOR = bi2de(double(rem(sum((de2bi(indices))));
另一种方法是定义一个递归函数,利用AND,OR,XOR运算是(逐位)关联的事实,即x OR y OR z等于(x OR y)OR z。要应用的操作作为函数句柄传递。
function r = bafun(v, f)
%BAFUN Binary Associative Function
% r = BAFUN(v,f)
% v is a vector with at least two elements
% f is a handle to a function that operates on two numbers
if numel(v) > 2
r = bafun([f(v(1), v(2)) v(3:end)], f);
else
r = f(v(1), v(2));
end
示例:
>> bafun([1,23,45,7,89,100], @bitor)
ans =
127