Matlab:检查二进制数中活动位的命令?

Matlab:检查二进制数中活动位的命令?,matlab,math,binary,Matlab,Math,Binary,这就是我如何处理存储二进制文件的数组 >> 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

这就是我如何处理存储二进制文件的数组

>> 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位是否有效?


还有一个更难的谜题:是否有一种类型不可知的解决方案可以同时使用二进制和DEC?

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

hhhh=['1010100'; '0010000'; '1010000'; '0001101'];
那你就可以了

find(bin2dec(hhhh) >= bin2dec('1000000'))
返回:

ans =

   1
   3
或者你可以使用不那么直观的(但可能更快)


要获得相同的结果。

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

hhhh=['1010100'; '0010000'; '1010000'; '0001101'];
那你就可以了

find(bin2dec(hhhh) >= bin2dec('1000000'))
返回:

ans =

   1
   3
或者你可以使用不那么直观的(但可能更快)

以获得相同的结果。

字符串输入 如果您有一个字符串输入,您可以通过测试
char
equality:

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

[r, c] = find(hhh == '1');
数字输入 对于数字输入,可以使用获取二进制表示形式。因此,它与字符串输入的解决方案非常相似:

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
字符串输入 如果您有一个字符串输入,您可以通过测试
char
equality:

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

[r, c] = find(hhh == '1');
数字输入 对于数字输入,可以使用获取二进制表示形式。因此,它与字符串输入的解决方案非常相似:

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

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

在这种情况下,不需要使用类似字符串/数组的位表示。 您可以在
find(mlf)
的输出上使用
bitget
。比如:

filled = find(mlf);
filled_and_bit2 = filled(logical(bitget(filled,2)));

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

在这种情况下,不需要使用类似字符串/数组的位表示。 您可以在
find(mlf)
的输出上使用
bitget
。比如:

filled = find(mlf);
filled_and_bit2 = filled(logical(bitget(filled,2)));

这不是对问题的直接回答,而是相关的——塞巴斯蒂安在评论中的观点很好!因此,假设二进制文件是索引。现在不是玩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:查找第三位处于活动状态的情况

4

7
1

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

4

7
1

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

4

7
1

7
4

这不是对问题的直接回答,而是相关的——塞巴斯蒂安在评论中的观点很好!因此,假设二进制文件是索引。现在不是玩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:查找第三位处于活动状态的情况

4

7
1

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

4

7
1

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

4

7
1

7
4

您意识到当您键入
1010100
时,不会得到二进制数,对吗?您得到的是十进制数字“一百万、一万和一百”。您如何存储二进制数组?这看起来就像一个
double
数组me@hhh这些不是二进制数,它们是小数。我认为你应该坚持使用字符串:
hhh=['1010100';'0010000';'1010000';'0001101']0001101无论如何不能是
表示。它将被减少到1101。确实很奇怪,
bitget
返回双精度,而不是逻辑性的…您意识到当您键入
1010100
时,您不会得到二进制数,对吗?您得到的是十进制数字“一百万、一万和一百”。您如何存储二进制数组?这看起来就像一个
double
数组me@hhh这些不是二进制数,它们是小数。我认为你应该坚持使用字符串:
hhh=['1010100';'0010000';'1010000';'0001101']0001101无论如何不能是
表示。它将被减少到1101。尽管非常奇怪,
bitget
返回双精度,而不是逻辑性的…This
hhhh=['1010100';'0010000';'1010000';'0001101'];find(bin2dec(hhhh)>bin2dec('0010000'))
应该返回
123
,而不仅仅是
12
,大于比较不是检查一个活动位,即第n位是否为1…@hhh然后使用
=
,但是字符串处理版本会更快,因为它们不需要调用
bin2dec
,我还无法取消该
查找(hhh(:,