bitget for array (count no. of bits)

Asked by Aravin on 7 Aug 2012
Latest activity Commented on by Aravin on 8 Aug 2012

Hi everyone,

How to take bitget of an array. Let say:

   a = 7;
   s = sum(bitget(a,1:8));

will return 3 as there are three bits on in number 7. If I have any array

   a = [1 2 7 6];

then how can I do the similar bit count operation for each element in a.

0 Comments

Aravin

Products

1 Answer

Answer by Matt Fig on 7 Aug 2012
Edited by Matt Fig on 8 Aug 2012
Accepted answer

ARRAYFUN might be useful here.

arrayfun(@(x) sum(bitget(x,1:8)),[1 2 7 6])

This is much faster for larger row vectors. D is the number of bits (8 in the above formula):

sum(rem(floor(bsxfun(@times,x',pow2(1-D:0))),2),2);

8 Comments

Aravin on 8 Aug 2012

Thanks Teja,

in my case my X is uint8 array (matrix). and it returns me the error : ??? Error using ==> bsxfun Mixed integer class inputs are not supported.

I don't want to change my x into double. is it possible to continue with uint8 ??

Matt Fig on 8 Aug 2012

Note carefully that the algorithm Teja gave you will automatically return all bits. I understood you to want to specify the bits to sum up. Either way, whether you specify D or calculate it using

 D = floor(log2(max(x(:)))) + 1;

you can simply use reshape like Teja did to work the algorithm on a matrix. As for the uint8 part, there is no need to change your actual matrix to double, just change the copy used by the algorithm. For example:

x = uint8(round(rand(10,20)*255));  % Your matrix: we preserve this.
S = double(x(:));  % Only temporary.  Overwritten below.
D = floor(log2(max(S))) + 1;  % Or specify D!  (As you need.)
S = reshape(sum(rem(floor(bsxfun(@times,S,pow2(1-D:0))),2),2),size(x));
Aravin on 8 Aug 2012

Thanks Matt

Matt Fig

Contact us