need 'for loop' to check 1:32 bit
2 views (last 30 days)
Show older comments
I have 606,774(1 row means event no.1) event number in 8 column(these are 32 bit values), these numbers are in decimal as shown in below. a=(strVals(1:10,1:8))
a =
0 0 0 0 0 3 0 0
0 0 0 0 0 576 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 48
0 0 1536 8192 0 0 0 0
0 0 0 0 0 0 50331648 0
0 0 0 0 0 6291456 0 0
0 0 0 67108864 0 0 256 0
0 0 0 768 0 0 0 0
0 0 0 4194304 0 0 0 0
This is only for 1:10 event,(I have 606,774 event no.). What I want here is, how to convert these number into binary at same time and how can I check 1:32 bit at once. I have use "bitget" function but I only able to get separately, may I need 'for loop' to get at once?1:32 bit means 1 through 32 bit of binary number(convert above decimal numbers into binary), so I need to know how to write a "for loop" to check each bit one at a time. Like >> bitget(a,1) command checks if the first (smallest/lowest) bit is set for all these numbers at the same time.
Please help me, thanks in advance.
4 Comments
Geoff Hayes
on 30 May 2014
Why do you need to check all 32 bits for all 606,774 events? What are you looking for in particular?
Accepted Answer
Geoff Hayes
on 30 May 2014
Since you are looking for which channels were hit across all stretchers for all events, then you will need two for loops for the looping of the data, and an additional inner for loop to iterate over the 32 channels. Something like
[m,n] = size(a);
for event=1:m
for stretcher=1:n
% do stuff
end
end
If you are only interested in those stretchers from some event that has a hit channel, then you can exclude all the 0's (since no hits on any channel) and the "do stuff" from above becomes
val = a(event,stretcher);
if val~=0
% now loop over the 32 channels
bitMask = 1;
channelsHit = cast(zeros(1,32),'uint8');
atHit = 0;
% iterate over each channel
for k=1:32
if bitand(val,bitMask)
% is one so a hit on channel k!
atHit = atHit+1;
channelsHit(atHit) = k;
end
% bit shift the mask by one
bitMask=bitshift(bitMask,1);
end
% remove empty elements from array and so we have a variable sized
% array of hit channels for the (event, stretcher) pair
channelsHit = channelsHit(1:atHit);
end
Once you have your list of hit channels for the (event, stretcher) pair, you can save those three pieces of information to a cell array for later analysis.
14 Comments
Geoff Hayes
on 10 Jun 2014
Chiranjibi - The code you pasted above will not always work
[R,C] =find(results==0);
for ii=1:32
disp(['stretcher:' num2str(C(ii)) ', channel:' num2str(R(ii)) ' appear to
be dead.'])
end
There is no guarantee that the number of elements in R or C will be 32. That should have been obvious from the results matrix that you posted in a previous comment.
As well, again in your above comment, there is a dotted line that you are asking help to "fill in" without providing any details or making the attempt yourself. Attempting something, on your own, is important and necessary.
Good luck with your coding of this interesting problem!
More Answers (0)
See Also
Categories
Find more on Particle & Nuclear Physics in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!