具有许多输入的Bitor等按位命令?

时间:2013-12-26 11:47:51

标签: matlab bit-manipulation

Matlab只使用按位命令输入两个输入,例如bitorbitor(1,2)返回3bitor(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

1 个答案:

答案 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'))

编辑:我刚刚发现了函数de2bibi2de(通讯工具箱),它们避免使用字符串。但是,它们似乎更慢了!

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