0

这就是我对存储二进制文件的数组的处理方式

>> hhh=[1 0 1 0 1 0 0; 0 0 1 0 0 0 0; 1 0 1 0 0 0 0; 0 0 0 1 1 0 1]; find(hhh(:,1)==1)

ans =

     1
     3

现在我想了解如何用二进制数来做

>> hhhh=[1010100; 0010000; 1010000; 0001101]; find(hhhh(:,1)==1)

ans =

   Empty matrix: 0-by-1

将所有二进制文件分解回数组的黑客可以工作(ismember('101010','1'),然后在前面加上零)但我觉得可能有更好的选择,所以

通过哪个命令检查二进制数中的第 N 位是否有效?

Ps 更难的谜题:是否有适用于二进制文件和 DEC 的与类型无关的解决方案?

4

4 回答 4

4

字符串输入

如果你有一个字符串输入,你可以避免测试char相等性:

find(hhh(:, 1) == '1')

对于字符串数组( char矩阵),您可以提取find(行和列)的两个输出,以确定哪个活动位对应于哪个字符串:

[r, c] = find(hhh == '1');

数字输入

对于数字输入,您可以使用bitget来获取二进制表示。从那里开始,它与字符串输入的解决方案非常相似:

B = bsxfun(@bitget, hhh, size(hhh, 1):-1:1);
[r, c] = find(B);

请注意,find搜索非零元素,因此无需find(B == 1)显式编写。

组合解决方案

如果“更难的谜题”的解决方案是你所追求的,你可以先确定输入的类型,并相应地处理它:

if ischar(hhh)
    %// Apply solution to string array
    %//...
else if isnumeric(hhh)
    %// Apply solution to numeric input
    %// ...
else
    %// This type is unsupported
    assert('Matrix is of unsupported type')
end
于 2013-10-28T11:39:20.153 回答
2

以答案的形式重复我的评论:

在这种情况下,无需使用类似字符串/数组的位表示。您可以bitgetfind(mlf). 像:

filled = find(mlf);
filled_and_bit2 = filled(logical(bitget(filled,2)));
于 2013-10-28T13:25:26.113 回答
0

您应该将二进制数存储为字符串矩阵:

hhhh=['1010100'; '0010000'; '1010000'; '0001101'];

然后你可以做

find(bin2dec(hhhh) >= bin2dec('1000000'))

返回:

ans =

   1
   3

或者你可以使用不太直观的(但可能更快)

find(hhhh(:,1)-'0')  %// Or find(hhhh(:,1)=='1') as EitanT points out

得到相同的结果。

于 2013-10-28T11:36:07.700 回答
0

这不是问题的直接答案,而是相关的——塞巴斯蒂安在评论中的好点!所以假设二进制文件是索引。现在而不是玩 dec2bin 之类的东西

>> hhh=dec2bin(find(mlf));B=bsxfun(@bitget, hhh, 8:-1:1);find(B)
Error using bsxfun
Non-singleton dimensions of the two input arrays must match each other.

我们可以直接处理索引,如

>> filled = find(mlf); 
filled_and_bit2 = bitget(filled,1); 
filled(logical(filled_and_bit2))

ans =

     1
     7

它找到具有第一个活动位的二进制文件。

程序

数据

>> mlf=sparse([],[],[],2^31,1);
mlf(1)=7;
mlf(4)=10;
mlf(7)=-1;
>> mlf

mlf =

                      (1,1)                       7
                      (4,1)                      10
                      (7,1)                      -1

>> find(mlf)

ans =

     1
     4
     7

将索引号解释为二进制

(1,1) -----> 000001

(4,1) -----> 000100

(7,1) -----> 000111

例子

输出 1:查找第 3 位有效的情况

4

7

输出:查找第 1 位处于活动状态的情况

1

7

输出:查找第 2 位处于活动状态的情况

4
于 2013-10-28T13:29:07.650 回答